スクリプトを1行ずつ自動的に実行しますが、2行目から始まる各行の前に尋ねます。

スクリプトを1行ずつ自動的に実行しますが、2行目から始まる各行の前に尋ねます。

私は20行ほどのスクリプトを作成していますが、1行ずつコピーして貼り付けて実行しながらテストを続けている自分を発見するようになりました。

Enter各行をコピーして貼り付けて[実行]をタップしたくありません。コピーして貼り付けるスクリプト全体を一度に実行する必要はありません(ブロックまたはここのドキュメント)、しかしファッションのようなクエリは次のとおりです。

  • getの最初の行は定期的に(無条件に)実行され、(出力を考慮するのに十分な時間が経過した後)、次の行を実行し続けるかどうかを尋ねられます。

  • 続行することを選択すると、そのまま残ります。それ以外の場合、ジョブは中断されます。

  • (もちろん、これまでの結果はロールバックされませんが、少なくともそれ以上の疑わしい結果は生成されません。)

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

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

ベストアンサー1

使用できるバッシュデバッガスクリプトをデバッグします。

より簡単なオプションは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。関数の内部でリセットされない限り、内部関数をトリガーしません。したがって、関数自体を含め、デバッグしたくない関数をスキップできますが、次のことを覚えておく必要がありますprompttrap関数は内部で実行されます)するデバッグしたい)

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

trap prompt DEBUG

そして

trap "" DEBUG

適切です。

おすすめ記事