私の標準的な慣行は、シェルスクリプトで次のイディオムを使用することです。
doCmd() {
if $verbose; then echo "$@" >&2; fi
if $really; then "$@"; fi
}
...
echo Begin whatever this script is doing
doCmd rm -rf test_results_dir
doCmd cd test_results_dir
doCmd run_lengthy_test
ご覧のとおり、このイディオムを使用すると、すべてのスクリプトに「-v」および「-n」オプションを追加し、コマンドを実行する前にstdoutにコマンドをほぼシームレスにエコーしたり、コマンドの実際の実装を抑制したりできます。私はこれがかなり一般的なイディオムだと思います。
しかし、これが私が詰まっている場所です。
doCmd tail -n +2 test.log | grep total > summary.log
doCmd tail -n +2 test.log
明らかにgrepを介して出力を実行してパイプします。しかし、私が本当に望むのは、「|」の行全体をエコーしてすべて標準出力に出力してから、作成したとおりに実行することです。
これは非常に簡単なことですか、それともシェルにあまりにも多くを要求していますか?