2012-08-11 16 views
37

複数のコマンドの標準出力を1つのコマンドにパイプする方法はありますか?複数のコマンドを1つのコマンドにパイプする

例1:コマンドをエコーすべての3つの出力を組み合わせて、ソート:

echo zzz; echo aaa; echo kkk 

所望の出力:

aaa 
kkk 
zzz 

例2:すべてのコマンドが単一になるように次のように書き換えます一時ファイルにリダイレクトせずにパイプを使用するコマンドライン。

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo 

答えて

66

括弧()を使用してコマンドを単一のプロセスに結合します。単一のプロセスは、それぞれのstdoutを連結します。

例1($は、シェルプロンプトであることに注意してください):

$ (echo zzz; echo aaa; echo kkk) | sort 
aaa 
kkk 
zzz 


例2:

(setopt; unsetopt; set) | sort 
+12

+1。また、サブシェルを生成しない中括弧を使用することもできます。構文は少し厳密です: '{setopt; unsetopt;セット; } |並べ替え| less " - 中括弧の周りの空白と末尾のセミコロンが必要です。 –

+6

@glenn:パイプラインがそれをサブシェルに強制するので、それは問題ではありません(bash 3.2.48でテストされています)。 –

+1

'$'はプロンプトであり、コマンドの一部ではないことに注意してください。 – Gilly

0

のWindowsでは、それは以下のようになります:(echo zzz & echo aaa & echo kkk) | sort

場合や、それはバッチファイルの中にあり、モノライン(サンプルのような)とマルチライン:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

注:オリジナルのポストではなく、スクリプト(echo diskpart_command)内部でdiskpartとVHD/VHDXで作業するとき、それは非常に便利です...それが唯一のLinux用ですので、私は、Windowsのコマンドラインのソリューションを追加して言及していませんしかし、そこにもエコーのない別の方法があり、>リダイレクタがありますが、それは非常にエラーになり、書くのがはるかに複雑になります。簡単な方法allwaysうまく働く)...また、%d%あなたに実際のパスを与えることを忘れないでください(VHD/VHDXファイルのパスをハードコーディングしないために非常に便利です)。

7

あなたはこのため{}を使用するので、同様に、(list)のようにサブシェルの必要性を排除することができます。

{ echo zzz; echo aaa; echo kkk; } | sort 

我々は{後と}前に空白文字が必要です。シーケンスが1行で記述されている場合は、最後の;も必要です。

は、我々はまた、任意の;を必要とせずに複数の行にそれを書くことができます:

例1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

例2:

{ 
    setopt 
    unsetopt 
    set 
} | sort 
関連する問題