コマンド出力をファイル(1行)に送信する前に処理できますか?

コマンド出力をファイル(1行)に送信する前に処理できますか?

引数を実行して結果をファイルに出力するコマンド処理機能があります。これでファイルを入力する前に、これらのコマンドの出力を処理する必要があります。

要件は1つだけです。echo "var is: $var"コードでさらに使用される結果を表示する必要があるということです。

これは私の要件に違反します。"${@:1}" | perl -pe 's/\**//g' >> './test.log'

私は次のことを想像しています:

"${@:1}" 1>> perl -pe 's/\**//g' >> './test.log'

しかし、うまくいきません。

コードを次のように単純化しました。

process() {
    "${@:1}" 1>>'./test.log'
}

process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
echo "var is: $var"

現在の関数は以下を出力します。

 screen :"var is: *****ONE *****WORD"

 logfile:"*****ONE *****WORD"

望ましい結果:

 screen :"var is: *****ONE *****WORD" 

 logfile:"ONE WORD"

この目標をどのように達成できますか?

PS。ムルはなぜ私にevalを使うのか尋ねました。コードを複製せずに変数を埋める他の方法がないので、答えました。残念ながら、彼の答えについての議論は削除されました。

ベストアンサー1

奇妙な理由で、変数を設定するためにここでそれを使用しているので、evalパイプではなく現在のシェルで実行する必要があります。したがって、プロセス置換が必要になる場合があります。

process () {
    "${@}" > >(perl ... >> test.log)
}

たとえば、

$ process () {
 "${@}" > >(perl -pe 's/\**//g' >> test.log)
}
$ process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
$ echo "var is: $var"
var is: *****ONE *****WORD
$ cat test.log
ONE WORD

おすすめ記事