web-dev-qa-db-ja.com

複数のコマンドを単一のコマンドにパイプする

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

例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
51
Rob Bednark

括弧()を使用して、コマンドを1つのプロセスに結合し、各プロセスの標準出力を連結します。

例1($はシェルプロンプトです):

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


例2:

(setopt; unsetopt; set) | sort
86
Rob Bednark

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

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

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

;を必要とせずに、複数行に記述することもできます。

例1:

{
  echo zzz
  echo aaa
  echo kkk
} | sort

例2:

{
  setopt
  unsetopt
  set
} | sort
13
codeforester

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

または、バッチファイル内にある場合、モノライン(サンプルなど)およびマルチラインになります。

(
 echo zzz
 echo aaa
 echo kkk
) | sort

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

2
Claudio