私はwhileループを使用しています。vared
ユーザーに入力するように求められます。タイムアウトを設定し、デフォルト変数を実行し、一定時間が経過してもユーザー入力がない場合は、プロンプトに戻る方法を探しています。読み取りコマンドとそのタイムアウトパラメータについて知っていますが、これは通過可能ですかvared
?
vared
また、プロンプトに印刷されないようにデフォルト値を設定する方法はありますか?
local command
while :
do
echo "Enter a command or type 'quit' to exit:"
vared -p "[*]: " command
if [ "$command" = "quit" ]; then
break
else
run command
fi
clear
done
答え1
次のことができます。
default=foobar
if
command=$(
saved_settings=$(stty -g)
trap 'stty $saved_settings; exit 1' ALRM
v=
TMOUT=10 vared -p "Enter a command [$default]: " v &&
printf %s $v
)
then
command=${command:-$default}
printf 'Got: "%s"\n' $command
else
print timeout
fi
変える始めるデフォルト値を持つ変数は空の文字列で埋められ、戻っvared
ても変数がまだ空の場合にのみデフォルト値に設定されます。
タイムアウトを処理するには、$TMOUT
サブシェルで特殊変数を使用します。この変数は、zle
サブシェルが数秒後に終了するようにします$TMOUT
。
これは10秒のグローバルタイムアウトです。もう1つのアプローチは、ユーザーに大きなコマンドを入力するのに十分な時間を提供しますが、3秒間アクティビティがない場合は、タイムアウトするターミナル行ルール文字間のタイムアウト(stty time x
10分の1としてマーク)を使用することです。x
default=foobar
if
command=$(
saved_settings=$(stty -g)
trap 'stty $saved_settings' EXIT INT TERM ALRM
zle-line-init() stty -icanon time 30 min 0 <&2
zle -N zle-line-init
v=
vared -p "Enter a command [$default]: " v &&
printf %s $v
)
then
command=${command:-$default}
printf 'Got: "%s"\n' $command
else
print
print timeout
fi
これらの操作はスクリプトで機能しますが、現在、対話型シェルでは機能しません。vared
サブシェルでの実行は拒否されるためです。で問題が解決するまでインタラクティブシェルで実行する必要がある場合は、次のようにzsh
変更できます。
command=$(
...
)
到着
command=$(default=$default zsh -c '
...
')