web-dev-qa-db-ja.com

スクリプトを1行ずつ自動的に実行するが、2行目以降は各行の前に要求される

約20行のスクリプトを作成し、1行ずつコピーして貼り付けて実行することで何度もテストしています。

各行をコピーして貼り付けてヒットする代わりに Enter 実行するには、スクリプト全体を(1つのブロックまたは heredocument として実行せずに、スクリプト全体をcopy-pasteしたい=)、しかしむしろファッションのようなクエリで;例えば:

  • 最初の行は定期的に(無条件に)実行され、次の行の実行を続行したい場合は(出力を検討するのに十分な時間を置いた後)照会されます。

  • 私が続行することを選択した場合-そうであっても、そうでない場合、操作は中断します。

  • (これまでの結果はもちろんロールバックされませんが、少なくとも問題のある結果が出続けることはありません)。

このパターンは、スクリプトが終了するまで、1行ずつ繰り返す必要があります。

この方法で作業するのに役立つユーティリティはありますか?

6
user149572

Bashデバッガー を使用して、スクリプトをデバッグできます。

より簡単なオプションは、DEBUGトラップを使用することです。

#!/bin/bash

function Prompt {
  if [[ -n "$BASH_COMMAND" ]]; then
    echo About to run \'$BASH_COMMAND\'
    read -p 'Continue [Y/n]?' CONT
    if [[ "$CONT" = "n" || "$CONT" = "N" ]]; then
      echo Exiting prematurely
      exit 1
    fi
  fi
}

trap Prompt DEBUG

echo Hello
ls
sleep 10

トラップが設定されると、すべてのコマンドの前にPrompt関数が実行され、続行するか中止するかを選択できます。 echo Helloで始まる行は、スクリプトが何であるかによって置き換えられますが、関数とtrapコマンドを、sourceを内部に配置する別のスクリプトレットに保存することもできます。デバッグするスクリプト。

DEBUGトラップに関連する微妙な点がいくつかあります。 1つは、関数内で再設定されない限り、関数内でトリガーされません(そのため、Prompt関数自体を含め、デバッグしたくない関数をスキップできますが、デバッグする関数do内でtrapを実行することを忘れないでください。

トレース動作は、次のように追加することで、スクリプトで自由に有効または無効にできます。

trap Prompt DEBUG

そして

trap "" DEBUG

適切に。

8
Stephen Kitt