複数のコマンドの標準出力を単一のコマンドにパイプするにはどうすればよいですか?
例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
括弧()を使用して、コマンドを1つのプロセスに結合し、各プロセスの標準出力を連結します。
例1($
はシェルプロンプトです):
$ (echo zzz; echo aaa; echo kkk) | sort
aaa
kkk
zzz
例2:
(setopt; unsetopt; set) | sort
次のように、{}
を使用して、(list)
のようにサブシェルの必要性を排除できます。
{ echo zzz; echo aaa; echo kkk; } | sort
{
の後、}
の前に空白文字が必要です。シーケンスが1行で書き込まれる場合、最後の;
も必要です。
;
を必要とせずに、複数行に記述することもできます。
例1:
{
echo zzz
echo aaa
echo kkk
} | sort
例2:
{
setopt
unsetopt
set
} | sort
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ファイルのパスをハードコーディングしない場合に非常に便利です)。