68

複数のコマンドの標準出力を1つのコマンドにパイプするにはどうすればよいですか?

例1:3つすべてのechoコマンドの出力を組み合わせて並べ替えます。

echo zzz; echo aaa; echo kkk

必要な出力:

aaa
kkk
zzz

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

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

3 に答える 3

99

括弧()を使用して、コマンドを1つのプロセスに結合します。これにより、各コマンドのstdoutが連結されます。

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

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


例2:

(setopt; unsetopt; set) | sort
于 2012-08-11T21:13:04.080 に答える
24

これに使用して、次のよう{}にサブシェルの必要性を排除できます。(list)

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

{前後に空白文字が必要}です。;シーケンスが1行に書き込まれる場合も、最後が必要です。

また、何も必要とせずに複数の行に書き込むこともできます;

例1:

{
  echo zzz
  echo aaa
  echo kkk
} | sort

例2:

{
  setopt
  unsetopt
  set
} | sort
于 2017-02-15T19:12:57.070 に答える
1

Windowsでは、次のようになります。(echo zzz & echo aaa & echo kkk) | sort

または、バッチファイル内にある場合は、単一行(サンプルなど)と複数行にすることができます。

(
 echo zzz
 echo aaa
 echo kkk
) | sort

注:元の投稿にはLinux専用であるとは記載されていないため、Windowsコマンドラインのソリューションを追加しました...スクリプト内のディスクパーツ()を使用してVHD / VHDXを操作する場合echo diskpart_commandは、エコーの代わりに非常に便利です。しかし、そこにecho、エコーなしで>リダイレクタを使用する別の方法もありますが、エラーが発生しやすく、記述がはるかに複雑です(常にうまく機能する単純な方法が存在する場合は、複雑なエラーが発生しやすい方法を使用するのはなぜですか)。 。また%d%、実際のパスを提供することを忘れないでください(VHD / VHDXファイルのパスをハードコーディングしない場合に非常に便利です)。

于 2016-12-12T14:36:52.233 に答える