Bash

Bash 補全在一個單詞後附加一個空格 - 我該如何阻止它?

  • May 23, 2022

我正在為 Bash 編寫一個選項卡完成腳本,使用 Python 來傳遞完成的結果。我正在使用虛擬腳本來顯示我遇到的問題,內容並不重要。

我有一個名為 的 Bash 腳本dothat,程式碼如下:

var=$1
echo "You have chosen $var"

我還有一個腳本,它為 創建製表符完成dothat,稱為dothat-completion.bash

_comp_func()
{
   COMPREPLY=()

   # Gets the output of a Python file and puts it into a variable
   fruits=$(python fruit.py)

   COMPREPLY=($(compgen -W "${fruits[*]}" -- $cur)) 
}

complete -F _comp_func dothat

以及(簡單)內容fruit.py

print('fruit:', end='')

Python 腳本只是將字元串列印到 STDOUT,然後由 Bash 補全函式擷取,並用於生成可能的匹配項以用於製表符補全。

現在,我想用這個腳本做的是,當我輸入 時dothat <TAB>,它會完成到dothat fruit:,最後沒有空格。問題是,當我鍵入dothat 並按 Tab 鍵時,它會完成到dothat fruit: ,並帶有不需要的尾隨空格。

我嘗試將 Python 的內容更改為以下內容,結果都相同:

print('"fruit:"', end='')
print("'fruit:'", end='')
print('fruit:', end='')
print("fruit:", end='')
print("fruit: ", end='')
print("fruit:          ", end='')
print('fruit')

甚至:

foo='fruit'
print(foo)

我所有的嘗試都是徒勞的,因為它們達到了相同的結果。字元串上是否有 0 個、1 個或 20 個空格都沒有關係:如果 Python 輸出字元串fruit:並將其回饋給 Bash 補全腳本,compgen將決定以fruit: 空格補全。

這裡有我錯過的明顯解決方案嗎?對於 Bash 還是 Python?

這是找到完全匹配時的預設行為complete,附加一個空格並允許在該行中進一步鍵入,表明該單詞已完成。在這裡你只有一個詞 into COMPREPLY,所以在TAB你完成這個詞之後。

要覆蓋此預設行為,您可以使用-o nospace. 來自man bashbuiltins

nospace告訴 readline 不要在行尾完成的單詞後面附加空格(預設)。

引用自:https://unix.stackexchange.com/questions/618907