web-dev-qa-db-ja.com

実行時のコマンドの各出力の接頭辞

モジュラースクリプトを作成しようとしています。単一のスクリプトから呼び出されるいくつかのスクリプト/コマンドがあります。
各個別のコマンドの出力にプレフィックスを付けたいです。

例:

私のファイルはallcommands.sh/command1.sh/command2.sh

command1.sh出力
file exists
file moved

command2.sh出力
file copied
file emptied

allcommands.shスクリプトを実行しますcommand1.shおよびcommand2.sh

次のように、これら2つのスクリプトの各出力にプレフィックスを付けたいです。
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

16
Ivan Dokov

Allcommands.shで何をしていると思います:

command1.sh
command2.sh

とそれをリレースするだけ

command1.sh | sed "s/^/[command1] /"
command2.sh | sed "s/^/[command2] /"
22
j_kubik

allcommands.shの最小限の例:

#!/bin/bash
for i in command{1,2}.sh; do
    ./"$i" | sed 's/^/['"${i%.sh}"'] /'
done

command1.shおよびcommand2.sh実行可能ファイルを使用して、同じディレクトリで必要な文字列をechoingするだけで、シェル出力が得られます。

$ ./command1.sh 
file exists
file moved
$ ./command2.sh 
file copied
file emptied
$ ./allcommands.sh 
[command1] file exists
[command1] file moved
[command2] file copied
[command2] file emptied

クイックsed内訳

sed 's/^/['"${i%.sh}"'] /'
  • s/は、「正規表現パターン一致および置換」モードに入ります
  • ^/は、「すべての行の先頭に一致する」ことを意味します
  • ${i%.sh}はシェルコンテキストで発生し、「$iを意味しますが、サフィックス.sh」を削除します
  • ['"${i%.sh}"'] /は、最初に[を出力し、引用符で囲まれたコンテキストを終了してシェルから$i変数を取得し、再度入力して]とスペースで終了します。
9