2017-04-24 47 views
0

我正在使用以下命令從用戶讀取一堆參數。Bash讀取命令 - 如何接受控制字符

read -p "Name`echo $'\n> '`" NAME 

我所有的參數都有默認值。我想爲用戶提供一個選項,以便在任何時候跳過提供值。即用戶可能提供前3個參數的值,並按Ctrl + s跳過爲其餘部分輸入值。

我該如何陷阱Ctrl + s

+0

據我所知,您只能捕獲信號。注意Ctrl + S已經對某些終端仿真器有意義(https://unix.stackexchange.com/questions/137842/what-is-the-point-of-ctrl-s),但我不確定如果你能做出這個「可捕獲」。 –

+0

用戶可以通過輸入Ctrl + V和Ctrl + S來輸入Ctrl + S. – codeforester

+0

Ctrl + [任何字符]適用於我。想知道如何去捕捉它 – pc70

回答

0

不確定你的意思是誘捕。用戶可以輸入Ctrl + S鍵按Ctrl + V,然後按Ctrl + S,和你的腳本就可以做檢查:

if [[ $NAME == '^S' ]]; then 
    ... 
    # skip asking for more values and continue with default values 
fi 
+0

Ctrl + V在這裏做什麼? – pc70

+3

@ pc70:控制-V指示下一個字符應該'逐字'處理 - 作爲一個字符而不做任何特殊的事情。它抑制了控制-D,控制-Z,控制-C,控制-S,控制-Q ......的特殊含義。 –

3

按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這將正確結束,但由於它不與系統無關,它需要額外的工作來支持正確的行編輯和不太常見的配置。

+0

沒有什麼比「門#1 - 的簡單和邏輯,你會沒事的。」或「2號門 - 並用指甲下面的竹子壓迫。」 - 你的選擇... –