シェルスクリプトで次のような場合:
read my_variable
Enter入力を保存するキーです。
機能を削除せずにTab同じことを行う方法はありますか?EnterEnter
ベストアンサー1
read -e
少し過剰かもしれませんが、ユーティリティでReadlineツールを有効にすることで取得できますread
。その時点で、目的の結果を得るためにキーを押すだけです。
しかし注意してください。 Readlineは、単純化のために完成、記録などの他の多くの機能も提供しますread my_variable
。これらの機能が必要ない場合は、明示的にキーバインディングを消去し、不要な機能を無効にする必要がありますread -e
。
コマンドラインの概念証明の例:
(bind 'TAB: accept-line'; IFS= read -re var && echo "$var" || echo ko)
bind
警告は表示されますが、スクリプトでもこれを行うことができます(リダイレクトを使用して警告を沈黙させることができます2>/dev/null
)。
スクリプトのコマンドの代替案は、bind
影響を及ぼすスクリプトを呼び出す前にカスタム inputrc ファイルを提供することです。実際の文書は必要ありません。ここの文書で十分です。
上記の例はスクリプトによって実装されています。
#!/bin/bash
export INPUTRC=/dev/fd/3
script2.sh 3<<EOF
TAB: accept-line
set history-size 0
EOF
# this example 'inputrc'-like file also disables history support
上記のスクリプトはカスタムinputrcファイルをファイル記述子3のHere Documentとして準備し、実行中のシェルは環境変数の指示に従ってファイルを読み取りますscript2.sh
。INPUTRC
それからscript2.sh
:
#!/bin/bash
echo start
bind -q accept-line 2>/dev/null # shows which keys are configured to accept input
IFS= read -re var && echo "$var" || echo ko
echo end
入力を待つ前に、read
スクリプトは次のように印刷します。
accept-line can be invoked via "\C-i", "\C-j", "\C-m".
ディスプレイTab(Ctrl-I例:上記のもの)\C-i
は、行のプラス(キャリッジリターンなど)または改行()を許可します。ReturnCtrl-MCtrl-J
もう少し「実際」の例を次に示します。
#!/bin/bash
bind 'TAB: accept-line' &>/dev/null
echo "enter your name:"
IFS= read -re var
echo "your name is: $var"
この道に降りたらぜひご覧くださいReadlineユーザーガイド、あなたの項目の1つ以上が減少しましたman bash
。set convert-meta off
非ASCII文字のより良いサポートのために、これらの設定について特に言及する価値があります。