;
標準入力から読み取り、文字を区切り文字として使用して入力行を終了し、ユーザーが行を編集できるようにする簡単なスクリプトを作成しようとしています。
これは私のテストスクリプトです。
#!/bin/bash
while true; do
read -e -d ";" -t 180 -p "><> " srcCommand
if [ $? != 0 ]; then
echo "end;"
echo ""
exit 0
fi
case "$srcCommand" in
startApp)
echo "startApp command";;
stopApp)
echo "stopApp command";;
end)
echo ""
exit 0
;;
*)
echo "unknown command";;
esac
done
これは機能しますが、区切り文字「;」を印刷しません。
# bash test.sh
><> startApp
startApp command
><> stopApp
stopApp command
><> end
-eオプションを削除すると印刷されますが、 ;
ユーザーはバックスペース文字で誤りを修正することはできず、エコーされた文字列は区切り文字の直後にあります。
# bash test.sh
><> startApp;startApp command
><> stopApp;stopApp command
><> end;
区切り文字を印刷し、ユーザーが標準入力を読みながら行を編集できるようにするにはどうすればよいですか。
これは予想される動作です。
# bash test.sh
><> startApp;
startApp command
><> stopApp;
stopApp command
><> end;
ありがとう
ベストアンサー1
zsh
ラインエディタに多くの機能があり、さらにカスタマイズが可能な場合はこれを使用してください。
#! /bin/zsh -
insert-and-accept() {
zle self-insert
# RBUFFER= # to discard everything on the right
zle accept-line
}
zle -N insert-and-accept
bindkey ";" insert-and-accept
bindkey "^M" self-insert
vared -p "><> " -c srcCommand
以上を使用すると、bash-4.3
次のハッキングで同様の操作を実行できます。
# bind ; to ^Z^C (^Z, ^C otherwide bypass the key binding when entered
# on the keyboard). Redirect stderr to /dev/null to discard the
# useless warning
bind '";":"\32\3"' 2> /dev/null
# new widget that inserts ";" at the end of the buffer.
# If we did bind '";":";\3"', readline would loop indefinitely
add_semicolon() {
READLINE_LINE+=";"
((READLINE_POINT++))
}
# which we bind to ^Z
bind -x '"\32":add_semicolon' 2> /dev/null
# read until the ^C
read -e -d $'\3' -t 180 -p '><> ' srcCommand
このバージョンでは、;
挿入は常に現在のカーソル位置ではなく、入力バッファの最後に行われます。次に変更してくださいadd_semicolon
。
add_semicolon() {
READLINE_LINE="${READLINE_LINE:0:READLINE_POINT++};"
}
カーソル位置に挿入するには、右側のすべての項目を削除してください。または:
add_semicolon() {
READLINE_LINE="${READLINE_LINE:0:READLINE_POINT};${READLINE_LINE:READLINE_POINT}"
READLINE_POINT=${#READLINE_LINE}
}
zsh
メソッドのようにカーソル位置に挿入したいが内容は右に保ちたい場合。
;
たとえば、したくない場合は$srcCommand
いつでも削除できますが、/ displayを渡すsrcCommand="${srcComman//;}"
にはウィジェットに挿入する必要があります。zle
readline