各コマンドは確認メッセージを表示します。

各コマンドは確認メッセージを表示します。

私は何かのために非常に一時的なインストールスクリプトを書いています。制御構造はあまりなく、基本的にコマンドリストのみがあります。ユーザーが各コマンドを実行する前に確認したいと思います。各コマンドにシェル関数名を付けずに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 > filefile言っても切れます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は独自の引用形式を理解しますが)のみ可能で、リダイレクト、パイプはありません。

おすすめ記事