シェルスクリプトでパイプラインチェーンの各ステップ入力をどのように印刷しますか?

シェルスクリプトでパイプラインチェーンの各ステップ入力をどのように印刷しますか?

簡単に言うと:パイプされたコマンド間のステップを含むbashシェルスクリプトの各ステップの入力と出力を印刷する方法はありますか?


これが関係していることを願っています。しばらく前にスクリプトを書いて今編集したいのですが、これ以上の仕組みを理解できません。このスクリプトを使用します。例えば:

#! /usr/bin/bash
set -ev

TREE_IGNORE_PATTERN='node_modules|package-lock.json|.gitignore|.git|dist'

echo '### Project Structure'
echo '```'
tree --noreport -F -a -I $TREE_IGNORE_PATTERN | tr -d '*'
echo '```'
echo ""

tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'

ご覧のとおり、私はset -v一番上にあります。これは実際に何が起こっているのかを知るのに役立ちますが、パイプラインの各ステップがどのように機能するかを理解するのに十分ではありません。実際に役立つのは、入力変換を段階的に調べることです。これは情報が多いため、通常は手動で行います。

  1. 使い方を忘れてしまったので、tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'ただコピーしておきます。
  2. これをコマンドラインに貼り付けます。
  3. なぜなら、次のような変数に依存するからです$TREE_IGNORE_PATTERN
    1. この変数の拡張値をコピーします。
    2. コマンドラインでこの変数を拡張値に置き換えます。
    3. これで、コマンドは次のようになります。tree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | ...
  4. enterコマンドラインから実行します。3.3ステップ。これは私の履歴にコマンドを保存し、を押して再び戻ることができるようにするためですup
  5. 私はを押しますup
  6. すべてのパイプコマンドを削除しますtree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist'
  7. 出力を理解するために実行しました。
  8. 私はを押しますup
  9. すべてのパイプコマンドを削除してコマンドラインを編集しました。しかし、1、私を残しますtree --noreport -nFif -I 'node_modules|package-lock.json|.gitignore|.git|dist' | awk '$0 !~ /\/$/ && $0 !~ /^\.$/'
  10. 出力を理解するために実行しました。
  11. 走るまで繰り返し3.3ステップ再びコマンドラインから。これで、入力変換のすべてのステップを見ることができます。

手がたくさん行く作業です。 Bashシェルスクリプトでパイプで接続された各コマンドの入力と出力を自動的に表示する方法はありますか?

答えが「いいえ、しかしzshそうです」なら、私はその答えを受け入れます(しかし受け入れられない場合にのみbash)。私も「いいえ。でも、次のようにコードを書く/コメントを付けるとこれ「もう一度訪れるとわかりやすくなりますbashzsh

ベストアンサー1

難読化されずに一度に1つのパイプのみをデバッグする必要がある場合は、tee各出力のコピーをファイルにパイプできます。あなたの場合:

tree --noreport -nFif -I $TREE_IGNORE_PATTERN | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tr -d '*' | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'

になります:

tree --noreport -nFif -I $TREE_IGNORE_PATTERN | tee out1.log | awk '$0 !~ /\/$/ && $0 !~ /^\.$/' | tee out2.log | tr -d '*' | tee out3.log | awk '{print "" ; print "### " $0 ; print "```" ; system("cat " $0 ) ; print "" ; print "```" ; print "" }'

おすすめ記事