回答:
stdout と stderrの両方を同じ場所にリダイレクトしたい場合があります。これ>&
が使用されるのは、あるファイル記述子を別のファイル記述子に向ける場合です。
たとえば、stdoutとstderrの両方を同じファイル(/dev/null
またはit output.txt
)に書き込みたい場合は、次のように別々にリダイレクトできます。
app 1>/dev/null 2>/dev/null
または、1つのファイル記述子をファイルにリダイレクトし、他のファイル記述子を最初のファイル記述子にリダイレクトすることもできます。
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
最初の例では、2>&1
ファイル記述子#2が#1がすでに指している場所を指します。2番目の例でも同じことが達成され、代わりにstderrで開始されます。
別の例として、stdout(ファイル記述子#1)がすでに目的の場所を指しているが、名前で参照できない場合があります(パイプ、ソケットなどに関連付けられている場合があります)。これは、通常、stdoutのみをキャプチャするプロセス拡張(` `
またはor $( )
演算子)を使用するときによく起こりますが、stderrを含めることもできます。この場合、>&
stderrをstdoutに向けるためにも使用します。
out=$(app 2>&1)
別の一般的な例はページャー、またはgrep
、または同様のユーティリティです。パイプ|
は通常stdoutでのみ機能するため、パイプを使用する前にstderrをstdoutにリダイレクトします。
app 2>&1 | grep hello
2>&1
どちら1>&2
が正しいかを知る方法は?すでに設定ファイルディスクリプタは、右に行く>&
と、リダイレクトするファイルディスクリプタは、左に行きます。(2>&1
「ファイル記述子#2をファイル記述子#1にポイント」を意味します。)
一部のシェルには、一般的なリダイレクトのショートカットがあります。Bashの例を次に示します。
1>
短くすることができます >
1>foo 2>&1
へ>&foo
たり&>foo
2>&1 | program
に |& program
the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left
。既にセットアップされたファイル記述子とはどういう意味ですか?それは何の権利を意味しますか?
必要な状況の1つstrace
は、ページャーで出力を表示する場合です。strace
出力を標準エラーに出力し、パイプは通常標準出力を標準入力に接続するため、リダイレクトを使用する必要があります。
strace -p $pid 2>&1 | less
pipes generally connect standard output to standard input
ですか?
|
)は最初のコマンドの標準出力を取得し、2番目のコマンドの標準入力に接続します。
2:これは、標準エラーと標準出力の両方からの出力があり、それらを単一の文字列に構成する場合に使用します。
1:標準エラーと標準出力の両方の出力を操作する場合。
>2
はすべて/ dev / nullに送信されます。または、私は完全に間違っていますか?
私はそれを使用して分離ジョブを開始します:
someProgram 2>&1 >& my.log &
その後、ログアウトできますが、someProgramは引き続き実行されます。この機能は、GNU Screen、tmux、および他のいくつかのプログラムによって提供されますが、ここでは外部の依存関係なしで実現されます。
nohup
またはdisown
そのような場合。
try
次の3つのファイルを含む名前のディレクトリがあると想像してください。file file1 and file2.
次のコマンドを実行します。
cat file file1 file2 file3
最初の3つのファイルは開きますがcat
、4番目のファイルは存在しないため、開くときにエラーがスローされます。
今実行してください:
cat file file1 file2 file3 1>outfile 2>&1
あなたは、画面上の任意の出力が表示されません。第一1>outfile
に、コマンドの出力をリダイレクトしますoutfile
し、それが(リダイレクトされます2>&1
)をオープンしようとしてエラーがスローfile3
にoutfile
。
1>&2
同様に機能し、エラーストリームを標準出力にリダイレクトします。
お役に立てれば!
代替シナリオ:端末コマンドは別の端末への出力を表示します
tty
各ターミナルでコマンドを使用して、それらを識別します。
$ tty
/dev/pts/0
$ tty
/dev/pts/1
これらのTTYを想定して、最初の標準出力を2番目にリダイレクトするには、最初の端末でこれを実行します。
exec 1>/dev/pts/1
注:これで、すべてのコマンド出力がpts / 1に表示されます。
pts / 0のデフォルトの動作stdoutを復元するには:
exec 1>/dev/pts/0
デモについては、このビデオを参照してください。
app 1>/dev/null 2>&1
2>&1が1がすでにリダイレクトしているファイルを指すことを意味するとは思いもしませんでした。簡単にできると思いapp > /dev/null &>
ますか?