Bash
Bash 補全在一個單詞後附加一個空格 - 我該如何阻止它?
我正在為 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
,附加一個空格並允許在該行中進一步鍵入,表明該單詞已完成。在這裡你只有一個詞 intoCOMPREPLY
,所以在TAB
你完成這個詞之後。要覆蓋此預設行為,您可以使用
-o nospace
. 來自man bashbuiltins
:nospace告訴 readline 不要在行尾完成的單詞後面附加空格(預設)。