私は何かのために非常に一時的なインストールスクリプトを書いています。制御構造はあまりなく、基本的にコマンドリストのみがあります。ユーザーが各コマンドを実行する前に確認したいと思います。各コマンドにシェル関数名を付けずにbashでこれを行う方法はありますか?
答え1
あなたが使用できるextdebug
:
shopt -s extdebug
trap '
IFS= read -rn1 -d '' -p "run \"$BASH_COMMAND\"? " answer <> /dev/tty 1>&0
echo > /dev/tty
[[ $answer = [yY] ]]' DEBUG
cmd1
cmd2
...
ちなみに、zsh
その内容は次のとおりです。
TRAPDEBUG() {
read -q "?run \"$ZSH_DEBUG_CMD\"? " || setopt errexit
echo > /dev/tty
}
cmd1
cmd2
...
携帯性が向上しました。
run() {
printf '%s ' "run $@?" > /dev/tty
IFS= read -r answer < /dev/tty
case $answer in
[yY]*) "$@";;
esac
}
run cmd1
run cmd2
run cmd3 > file
run cmd3 > file
とfile
言っても切れますn
。そのため、次のように書きたい場合があります。
run eval 'cmd3 > file'
または、次の関数eval
に移動してください。run
run() {
printf '%s ' "run $@?" > /dev/tty
IFS= read -r answer < /dev/tty
case $answer in
[yY]*) eval "$@";;
esac
}
run cmd1
run 'cmd2 "$var"'
run 'cmd3 > file'
別のポータブル製品ですが、より多くの制限があります。
xargs -pL1 env << 'EOF'
cmd1 "some arg"
cmd2 'other arg' arg\ 2
ENV_VAR=value cmd3
EOF
これはコマンド(内のコマンド$PATH
)でのみ機能し、引数はリテラル文字列(変数やシェル構造はありませんが、xargsは独自の引用形式を理解しますが)のみ可能で、リダイレクト、パイプはありません。