&&でチェーンされたコマンドの出力/リダイレクトのキャプチャ


10

一連のコマンドa、b、cがあり、それらを&&:と一緒にチェーンしていますa && b && c

すべてのコマンドの出力をstdoutとstderrの両方にキャッチしたい。 a && b && c 2>&1 > capture_file cコマンドからの出力のみをキャプチャします。

回答:


10
{ a && b && c; } >capture_file 2>&1

リダイレクトの順序に注意してください。最初にstdoutをリダイレクトする必要があります。


なぜstdoutが最初なのですか?
TLOlczyk 2015

@TLOlczyk 2>&1は、stdout(1)の宛先をstderr(2)に複製することを意味するため、事前にstdoutリダイレクションを設定していなければ、役に立ちません。
八重樫2015

2
@TLOlczykそれはありません持っている:あなたは、最初に標準エラー出力を行うことができ-最初の標準出力する2>capture_file >&2(しかし、それは慣用的ではありませんので、しないでください)。重要なことは、ストリームをもう一方に複製する前に、一方をファイルにリダイレクトすることです。
Toby Speight 2015

1

コマンドのグループ化{}を使用する以外に、サブシェルでコマンドを実行して、出力(および/またはエラー)を一度にキャプチャすることもできます。

( a && b && c ) >file.txt 2>&1

例:

$ ( echo foo && echo bar && echo baz && echos foo ) >check 2>&1

$ cat check
foo
bar
baz
No command 'echos' found, did you mean:
 Command 'echo' from package 'coreutils' (main)
echos: command not found
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.