我正在使用以下命令從用戶讀取一堆參數。Bash讀取命令 - 如何接受控制字符
read -p "Name`echo $'\n> '`" NAME
我所有的參數都有默認值。我想爲用戶提供一個選項,以便在任何時候跳過提供值。即用戶可能提供前3個參數的值,並按Ctrl + s跳過爲其餘部分輸入值。
我該如何陷阱Ctrl + s?
我正在使用以下命令從用戶讀取一堆參數。Bash讀取命令 - 如何接受控制字符
read -p "Name`echo $'\n> '`" NAME
我所有的參數都有默認值。我想爲用戶提供一個選項,以便在任何時候跳過提供值。即用戶可能提供前3個參數的值,並按Ctrl + s跳過爲其餘部分輸入值。
我該如何陷阱Ctrl + s?
不確定你的意思是誘捕。用戶可以輸入Ctrl + S鍵按Ctrl + V,然後按Ctrl + S,和你的腳本就可以做檢查:
if [[ $NAME == '^S' ]]; then
...
# skip asking for more values and continue with default values
fi
Ctrl + V在這裏做什麼? – pc70
@ pc70:控制-V指示下一個字符應該'逐字'處理 - 作爲一個字符而不做任何特殊的事情。它抑制了控制-D,控制-Z,控制-C,控制-S,控制-Q ......的特殊含義。 –
按Ctrl + S是終端滾動鎖定的性格,而不是立即可用。你有兩個選擇:
與系統工作,使用該系統的標準鍵連擊,使生活更容易爲自己和其他人。
對抗系統,堅持使用這個關鍵組合,做任何事情來實現它,然後承受後果。
如果您想使用系統,請考慮使用空白行和/或Ctrl + D,它已廣泛用於結束輸入。這很容易和強大:
if read -p "Name (or blank for done)"$'\n> ' name && [[ $name ]]
then
echo "User entered $name"
else
echo "User is done entering things"
fi
另外,這裏的戰鬥系統啓動:
#!/bin/bash
settings=$(stty -g)
echo "Enter name or ctrl+s to stop:"
stty stop undef # or 'stty raw' to read other control chars
str=""
while IFS= read -r -n 1 c && [[ $c ]]
do
[[ $c = $'\x13' ]] && echo "Ctrl+S pressed" && break
str+="$c"
done
echo "Input was $str"
stty "$settings"
當用戶點擊一個標準配置Ctrl + S這將正確結束,但由於它不與系統無關,它需要額外的工作來支持正確的行編輯和不太常見的配置。
沒有什麼比「門#1 - 的簡單和邏輯,你會沒事的。」或「2號門 - 並用指甲下面的竹子壓迫。」 - 你的選擇... –
據我所知,您只能捕獲信號。注意Ctrl + S已經對某些終端仿真器有意義(https://unix.stackexchange.com/questions/137842/what-is-the-point-of-ctrl-s),但我不確定如果你能做出這個「可捕獲」。 –
用戶可以通過輸入Ctrl + V和Ctrl + S來輸入Ctrl + S. – codeforester
Ctrl + [任何字符]適用於我。想知道如何去捕捉它 – pc70