シェルスクリプトは、EnterキーとTabキーを介して「読み取り」を許可します。

シェルスクリプトは、EnterキーとTabキーを介して「読み取り」を許可します。

シェルスクリプトで次のような場合:

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.shINPUTRC

それから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".

ディスプレイTabCtrl-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 bashset convert-meta off非ASCII文字のより良いサポートのために、これらの設定について特に言及する価値があります。

おすすめ記事