2016-04-24 6 views
5

一つのコマンドとしてのパイプを参照してください。

これは私がパイプそれらを一緒にするとき、それは2つのコマンドを出力することを除いて、正常に動作します:

bzip2 -dc < dump.sql.bz2 | mysql test 

プリント:

$ bzip2 -dc < dump.sql.bz2 
$ mysql test 

私はtrapまたはに何らかの変更を加えることができますラインが1つとして印刷されるようにパイプとライン?

答えて

2
にあなたのコマンドを変更

:代わりにパイプラインの

process substitutionを使用して
mysql test < <(bzip2 -dc < dump.sql.bz2) 

は、コマンドにDEBUGトラップの粒度のレベルと内蔵されバッシュの視点からシンプルコマンドを作ります$BASH_COMMANDで可変動作します。

背景

$BASH_COMMAND

がそうであるように設計することによりDEBUG(擬似)信号は、単純コマンドのレベルで動作します。

bzip2 -dc < dump.sql.bz2 | mysql test複数簡単なコマンドのを構成パイプラインです。

したがって、trapステートメントはパイプラインを使用して必要な処理を実行できません。

化合物コマンドを使用して、あなたが望むものを得るために最も近いもの(例えば、whileループまたはコマンド・グループ({ ...; ...; })または(単純なコマンドまたはパイプラインは、オペレータ; && || &と結合コマンドリスト)を使用することですそれが実行される前stderrのにコマンド全体をエコーset -v、が、私は、この出力のをフォーマットを制御する方法を知っているだろう

+0

bashは*パイプラインを知って*いるでしょうか?配管をある種のツールに委譲することはできないので、bashの観点からは単一のコマンドです。 – AndreKR

+0

パイプラインを_function_の内側に置くことができ、その関数の呼び出しはBashの観点から_simple_コマンドになりますが、実際のパイプラインも隠されます。 – mklement0

+0

ファイル名は受け付けませんが、 'mysql test <(bzip2 -dc AndreKR

1

粗製の回避策は、このように、機能を使用することになります。

run() { eval $1; } 
trap 'echo -e "\e[92m$ $BASH_COMMAND\e[0m"' DEBUG 
run "bzip2 -dc < dump.sql.bz2 | mysql test" 

出力:

$ run "bzip2 -dc < dump.sql.bz2 | mysql test" 
+0

++;コマンド文字列を完全に制御する限り、非常に賢明で安全です。 – mklement0

+1

'$ 1'は* function *のパラメータなので、これは元のコマンドと同じくらい正確に安全であると仮定します。これは現在、関数のパラメータとして供給されています。 – AndreKR

+0

完全に合意しました - 私はちょうど赤い旗を浮上させる 'eval'の使用により将来の読者が持つ懸念を和らげたいと思っていました。 – mklement0

関連する問題