シェルでは、「2>&1」はどういう意味ですか?


2284

Unixシェルで、さらに操作するためにストリームに結合stderrしたい場合は、コマンドの最後に次を追加できます。stdoutstdout

2>&1

したがって、headからの出力で使用したい場合g++は、次のようなことができます。

g++ lots_of_errors 2>&1 | head

最初の数個のエラーしか見ることができません。

私はいつもこれを思い出すのに苦労しており、常に調べなければなりません。これは、主にこの特定のトリックの構文を完全に理解していないためです。

誰かがこれを分解して、文字ごとに何を2>&1 意味するのか説明できますか?


50
@dbr私はそれが単なるbashだとは思いません-それはボーンシェルのものだと思います。したがって、sh、bash、ksh、ash、dashなど
銃は、

8
これは、POSIX準拠のシェル、または略してPOSIXシェルを説明するリダイレクト段落の一部です。kshは、たとえばPOSIXシェルです。参照:pubs.opengroup.org/onlinepubs/009695399/utilities/...
ジム・マクナマラ

12
この構成はWindowsでも機能します。
Vadzim 2013年

2
通常2>&12> / dev / nullよりも優れています ;-)
F. Hauri

11
私は、zshを使用|& している2>&1 |場合の省略形であることを述べたいと思いました。それが他のボーンのようなシェルに適用されるのか、それがzshのみの機能なのかは、私には言えません。
chrixian 2013

回答:


2557

ファイル記述子1は標準出力(stdout)です。
ファイル記述子2は標準エラー(stderr)です。

この構成を覚える方法の1つを示します(ただし、完全に正確ではありません)。最初は、2>1にリダイレクトstderrするのに適した方法のように見えるかもしれませんstdout。ただし、実際には「stderrという名前のファイルにリダイレクトする」と解釈されます1&後に続くのはファイル記述子であり、ファイル名ではないことを示します。したがって、構成は次のようになります2>&1


281
しかし、それはむしろそうではあり&2>&1ませんか?
dokaspar 2013

319
@Dominik:いいえ、&リダイレクトのコンテキストで「ファイル記述子」を意味するようにのみ解釈されます。書き込みcommand &2>&command &and として解析されます2>&1。つまり、「commandバックグラウンドで実行し、コマンド2を実行して、そのstdoutをstdoutにリダイレクトします」。
Adam Rosenfield

15
なぜ彼らはこのような難解なものを選んだのですか?ちょっと興味があるんだけど。
CommaToast 2014年

81
しかし、どのようにstderrを '&1'という名前のファイルにリダイレクトしますか?
マルティンFixman

120
@Martin:2>'&1'

632
echo test > afile.txt

stdoutをにリダイレクトしafile.txtます。これは同じことです

echo test 1> afile.txt

stderrをリダイレクトするには、次のようにします。

echo test 2> afile.txt

>& ストリームを別のファイル記述子にリダイレクトする構文です。0はstdin、1はstdout、2はstderrです。

stdoutをstderrにリダイレクトするには、次のようにします。

echo test 1>&2 # or echo test >&2

またはその逆:

echo test 2>&1

つまり、要するに... 2>stderrを(指定されていない)ファイルに&1リダイレクトし、stderrをstdoutにリダイレクトします。


5
これはあなたにとって意味がありますjava ... 2&1 >> data.logか、同僚の1人がこれを行ったのを見ましたか?
タンファン

5
@Harryは、bashではないシェルまたはタイプミスのように見えます.. cmd 2>&1 >> somefile.logstdout / stderrをファイルに追加します-これは基本的に上記と同じですが、>> file追加します
dbr

73
@dbr cmd 2>&1 >>fileはstderrをファイルにリダイレクトしませんが、リダイレクトcmd >> file 2>&1します。順序は重要です。最初のケースでは、stderrはシェルのstdout(コマンドがインタラクティブに入力された場合はtty)にリダイレクトされ、次にstdoutがファイルに送られます。2番目のケースでは、stdoutがファイルに送信され、次にstderrが同じ場所に送信されます。
ウィリアムパーセル2013

2
私は上記の答えが好きですが、少しわかりやすいかもしれません。"2>&1"はstderrをstdoutのターゲットにリダイレクトします。したがって、 "ls -l >> directoryContents 2>&1"のようなものがあれば、結果はdirectoryContentsという名前のファイルになり、作業ディレクトリの内容が追加されます。実行中にエラーが発生した場合:エラーメッセージは、発生時にdirectoryContentsファイルにも追加されます。
Max West

1
ある0(or 1,2)>&0(or 1,2)出力を制御するためのオプションのような?とecho test >test.log 2>&1同じecho test 2>&1 >test.logですか?
Simin Jie

318

リダイレクトに関するいくつかのトリック

これに関する構文の特殊性には、重要な動作がある場合があります。リダイレクトは約いくつかの小さなサンプルがありSTDERRSTDOUT、と引数の順序

1-上書きまたは追加?

記号>リダイレクトを意味します。

  • >完成したファイル全体を送信することを意味し、存在する場合はターゲットを上書きします(後で#3のnoclobber bash機能を参照)。
  • >>存在する場合、ターゲットに追加するほかに送信することを意味します

いずれにしても、ファイルが存在しない場合は作成されます。

2- シェルコマンドラインは順序に依存します!!

これをテストするには、両方の出力で何かを送信する単純なコマンドが必要です。

$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

/tntもちろん; という名前のディレクトリがないことを期待しています。)まあ、それがあります!

だから、見てみましょう:

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

最後のコマンドラインSTDERRはコンソールにダンプし、予想される動作ではないようです...しかし...

1つの出力、他の出力、またはその両方についてポストフィルタリングを行う場合:

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->

この段落の最後のコマンドラインは、前の段落とまったく同じであることに注意してください。ここで、私が書いたところは、予期された動作ではないようです(したがって、これは予期された動作である可能性もあります)。

さて、両方の出力で異なる操作行うために、リダイレクトに関する小さなトリックがあり ます

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2  2>&1  | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan  7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory

注意:&9記述子が原因で、自然に発生します) 9>&2

補遺:nota!新しいバージョンの>4.0)この種のことを行うための新しい機能とよりセクシーな構文があります:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory

そして最後に、そのようなカスケード出力フォーマットについて:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
     1  O: drwxrwxrwt 118 root root 196608 Jan  7 12:29 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

補遺:nota!どちらの方法でも同じ新しい構文:

$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
     1  O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

STDOUT特定のフィルターを通過する場所から、別のフィルターを通過し、STDERR最後にマージされた両方の出力は、3番目のコマンドフィルターを通過します。

3- noclobberオプションと>|構文について

それは上書きについてです:

既存のファイルを上書きset -o noclobberないようにbashに指示する一方で、>|構文によりこの制限を通過させることができます。

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:21 CET 2013

ファイルは毎回上書きされるようになりました。

$ set -o noclobber

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

を通過>|

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013

このオプションの設定を解除するか、すでに設定されている場合は問い合わせます。

$ set -o | grep noclobber
noclobber           on

$ set +o noclobber

$ set -o | grep noclobber
noclobber           off

$ date > $testfile ; cat $testfile
Mon Jan  7 13:24:27 CET 2013

$ rm $testfile

4-最後のトリックなど...

特定のコマンドから両方の出力をリダイレクトする場合、正しい構文は次のようになります。

$ ls -ld /tmp /tnt >/dev/null 2>&1

この特別な場合には、ショートカット構文があります:&>...または>&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

注意:2>&1存在する場合1>&2、正しい構文です:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4b-今、私はあなたに考えさせます:

$ ls -ld /tmp /tnt 2>&1 1>&2  | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1  | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

4c- 詳細情報に興味がある場合

あなたは以下を押すことで良いマニュアルを読むことができます:

man -Len -Pless\ +/^REDIRECTION bash

コンソール ;-)


5
深い読み:あなたはこれを好きなら、あなたはapreciateことがあります。リダイレクト虐待が奇妙な振る舞いを与えることができる方法
F. HAURI


130

私はリダイレクトに関するこの素晴らしい投稿を見つけました:リダイレクトに関するすべて

標準出力と標準エラーの両方をファイルにリダイレクトします

$コマンド&>ファイル

このワンライナーは、&>オペレーターを使用して、両方の出力ストリーム(stdoutとstderr)をコマンドからファイルにリダイレクトします。これは、両方のストリームを同じ宛先にすばやくリダイレ​​クトするためのBashのショートカットです。

Bashが両方のストリームをリダイレクトした後のファイル記述子テーブルは次のようになります。

ここに画像の説明を入力してください

ご覧のとおり、stdoutとstderrの両方がをポイントしていfileます。したがって、stdoutとstderrに書き込まれたものはすべてに書き込まれfileます。

両方のストリームを同じ宛先にリダイレクトする方法はいくつかあります。各ストリームを次々にリダイレクトできます:

$コマンド>ファイル2>&1

これは、両方のストリームをファイルにリダイレクトするより一般的な方法です。最初にstdoutがファイルにリダイレクトされ、次にstderrが複製されてstdoutと同じになります。したがって、両方のストリームはを指してしまいfileます。

Bashが複数のリダイレクトを検出すると、それらを左から右に処理します。ステップを実行して、それがどのように行われるかを見てみましょう。コマンドを実行する前は、Bashのファイル記述子テーブルは次のようになります。

ここに画像の説明を入力してください

これで、Bashは最初のリダイレクトファイルを処理します。これは以前に見たことがあり、stdoutがファイルを指すようにします。

ここに画像の説明を入力してください

次に、Bashは2番目のリダイレクト2>&1を確認します。これまでにこのリダイレクトを見たことはありません。これはファイル記述子2を複製してファイル記述子1のコピーにしたもので、次のようになります。

ここに画像の説明を入力してください

両方のストリームがファイルにリダイレクトされました。

ただし、ここで注意してください。書き込み

コマンド> file 2>&1

書くことと同じではありません:

$コマンド2>&1>ファイル

Bashではリダイレクトの順序が重要です!このコマンドは、標準出力のみをファイルにリダイレクトします。stderrは引き続きターミナルに出力します。なぜそうなるのかを理解するために、もう一度ステップを実行してみましょう。したがって、コマンドを実行する前のファイル記述子テーブルは次のようになります。

ここに画像の説明を入力してください

Bashはリダイレクトを左から右に処理します。最初に2>&1が検出されるため、stderrがstdoutに複製されます。ファイル記述子テーブルは次のようになります。

ここに画像の説明を入力してください

これで、Bashは2番目のリダイレクトを確認し、>filestdoutをファイルにリダイレクトします。

ここに画像の説明を入力してください

ここで何が起こるかわかりますか?stdoutはファイルを指すようになりましたが、stderrは依然としてターミナルを指します!stderrに書き込まれたものはすべて画面に出力されます!リダイレクトの順序には十分注意してください。

また、バッシュでは、

$コマンド&>ファイル

とまったく同じです:

$コマンド>&file


3
最後の2つは、「コマンド」の末尾が数字の場合は異なります。これは、オプションのファイル記述子として使用されるためです>&
MM

とても素敵な絵と説明!「重複」の本当の意味を詳しく教えてください。「これは[2>&1]がファイル記述子2を複製してファイル記述子1のコピーになる」と述べました。stderrがstdoutに複製されるようです。しかし、それが事実なら、私もエラーを見るべき/dev/tty0でしょうか?
HCSF、

87

番号はファイル記述子(fd)を参照します。

  • ゼロは stdin
  • 一つは stdout
  • 二つは stderr

2>&1 fd 2を1にリダイレクトします。

プログラムがそれらを使用する場合、これは任意の数のファイル記述子に対して機能します。

あなたが/usr/include/unistd.hそれらを忘れた場合、あなたは見ることができます:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

とは言っても、カスタムロギングに非標準のファイル記述子を使用するCツールを作成したので、ファイルなどにリダイレクトしない限り表示されません。


58

その構成により、標準エラーストリーム(stderr)が標準出力()の現在の場所に送信stdoutされます。この通貨の問題は、他の回答では無視されているようです。

このメソッドを使用して、任意の出力ハンドルを別のハンドルにリダイレクトできますが、ほとんどの場合、処理のために単一のストリームにチャネル化stdoutおよびstderrストリーミングするために使用されます。

次に例を示します。

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

その最後の1がすることに注意してくださいません直接stderroutfile2それが何にリダイレクト- stdout引数が発生したとき(だったoutfile1)と、その後リダイレクトstdoutしますoutfile2

これはかなり洗練されたトリックを可能にします。


5
最後の例は次のように明確になりますが、foo> outfile2 2> outfile1
Michael Cramer

3
より明確です、はい、しかしそれはリダイレクトの「位置的」性質を示しません。この例は、通常は1行でこれを行うことは役に立たないために工夫されています。このメソッドは、リダイレクトのさまざまな部分をさまざまな関係者が担当する場合に非常に役立ちます。たとえば、スクリプトが1つのビットリダイレクションを行い、それを別のビットで実行するとします。
paxdiablo 2009年

5
最後の例は、なぜこれが次のsome_program 2>&1 > /dev/nullように機能しないのかについて私が長年抱えていた混乱も解決することに気づきましたsome_program > /dev/null 2>&1
snapfractalpop 2012

最後の例についてのあなたのコメントは金色の文字の価値があります:-)私はこれらの再方向付け引数が位置的であるとは思いませんでした...これを知ることはかなり重要だと思います。
Nils-o-mat

20

2>&1POSIXシェル構造です。トークンごとの内訳です。


2:「標準エラー」出力ファイル記述子。

>&出力ファイル記述子演算子(出力リダイレクト演算子の変形)を複製します>。とすると[x]>&[y]、で示されるファイル記述子xは、出力ファイル記述子のコピーになりますy

1標準出力」出力ファイル記述子。

この式は2>&1ファイル記述子1をlocationにコピーする2ため2、実行環境で(「標準エラー」)に書き込まれる出力は、1(「標準出力」)で最初に記述された同じファイルに送られます。


詳細説明:

ファイル記述子:「ファイルアクセスの目的で開いているファイルを識別するために使用されるプロセスごとの一意の非負整数。」

標準出力/エラー:シェルのドキュメントのリダイレクトセクションにある次のメモを参照してください。

開いているファイルは、ゼロで始まる10進数で表されます。可能な最大値は実装定義です。ただし、すべての実装では、アプリケーションで使用するために少なくとも0〜9をサポートする必要があります。これらの番号は「ファイル記述子」と呼ばれます。値0、1、および2には特別な意味と従来の使用法があり、特定のリダイレクト操作によって暗示されます。これらは、それぞれ標準入力、標準出力、標準エラーと呼ばれます。プログラムは通常、標準入力から入力を受け取り、標準出力に出力を書き込みます。エラーメッセージは通常、標準エラーに書き込まれます。リダイレクト演算子の前に1つ以上の数字を付けることができ(間に文字を入れないでください)、ファイル記述子番号を指定します。


19

2はコンソールの標準エラーです。

1はコンソールの標準出力です。

これは標準のUnixであり、WindowsもPOSIXに準拠しています。

例えばあなたが走るとき

perl test.pl 2>&1

標準エラーは標準出力にリダイレクトされるため、両方の出力を一緒に確認できます。

perl test.pl > debug.log 2>&1

実行後、エラーを含むすべての出力をdebug.logで確認できます。

perl test.pl 1>out.log 2>err.log

次に、標準出力はout.logに、標準エラーはerr.logに出力されます。

これらを理解することをお勧めします。


2番目のサンプルは間違っています。注文の優先順位STDERRSTDOUTにリダイレクトされるため、デフォルトのSTDOUTのみがdebug.logに書き込まれます(STDERRではなく)。私の答え(段落#2)を参照しください。確実にするために、両方が同じファイルにリダイレクトされるように、あなたが反転リダイレクトディレクティブを持っている:perl test.pl > debug.log 2>&1
F. HAURI

16

あなたの質問に答える:エラー出力(通常はstderrに送信されます)を受け取り、それを標準出力(stdout)に書き込みます。

これは、たとえば、すべての出力のページングが必要な場合の「more」に役立ちます。一部のプログラムは、使用状況情報をstderrに出力するのを好みます。

覚えやすくする

  • 1 =標準出力(プログラムが通常の出力を印刷する場合)
  • 2 =標準エラー(プログラムがエラーを出力する場合)

"2>&1"は単にstderrに送信されるすべてのものを指し、代わりにstdoutを指します。

この記事が完全にカバーされているエラーリダイレクトに関するこの投稿を読むことをお勧めします


11

プログラマーの観点から、これは正確にこれを意味します:

dup2(1, 2);

manページを参照してください

それ2>&1コピーであることを理解すると、その理由も説明されます...

command >file 2>&1

...は...と同じではありません

command 2>&1 >file

1つ目は両方のストリームをfileに送信し、2つ目はエラーをstdoutに送信し、通常の出力をに送信しfileます。


9

あなたがこれを読んだ初心者であるならば、私はこれがとても役に立ちました

更新:
LinuxまたはUnixシステムでは、プログラムが出力を送信する場所が2つあります。標準出力(stdout)と標準エラー(stderr)です。これらの出力を任意のファイルにリダイレクトできます。

こうすると

ls -a > output.txt

、コンソールには何も出力されず、すべての出力(stdout)が出力ファイルにリダイレクトされます。

そして、存在しないファイルの内容を印刷しようとすると、現在のディレクトリに存在しないtest.txtを印刷する場合と同様に、出力はエラーに

cat test.txt > error.txt

なります。出力は

cat: test.txt :No such file or directory

しかし、stdoutをstderrではなくファイルにリダイレクトするため、error.txtファイルは空になります。

したがって、ファイル記述子(ファイル記述子は開いているファイルを表す正の整数にすぎません。記述子はファイルの一意のIDと言えます)は、ファイルに送信する出力のタイプをシェルに指示します。Unix/ Linuxシステムの場合1はstdout用、2はstderr用です。 つまり、

これを行うと、

ls -a 1> output.txt標準出力(stdout)をoutput.txtに送信することになります。

これを行うと、

cat test.txt 2> error.txt標準エラー(stderr)をerror.txtに送信します。

&1ファイル記述子1(stdout)の値を参照するために使用されます。

ここで要点2>&1は、「stderrをstdoutをリダイレクトしているのと同じ場所にリダイレクトする」という意味です。

今、これを行うことができます

cat maybefile.txt > output.txt 2>&1

標準出力(stdout)と標準エラー(stderr)の両方がoutput.txtにリダイレクトされます。

指摘して くれたOndrej Kに感謝


1
リンクのみの回答には問題があります。リンクが機能しなくなり、回答が役に立たなくなる場合があります。常に答え自体に十分な詳細を含める必要があります。
Ondrej K.

7

人々は、リダイレクトターゲットの現在の場所に関するpaxdiabloのヒントを常に覚えています...それ重要です。

2>&1オペレーターのための私の個人的なニーモニックはこれです:

  • &意味として考えてください('and'または'add'、文字はアンペアです - そして、そうではありませんか?)
  • つまり、2(stderr)を1(stdout)が既に/現在の場所にリダイレクトし両方のストリームを追加する」になります。

同じニーモニックは、頻繁に使用される他のリダイレクトでも機能します1>&2

  • 考える&意味andadd...(あなたがはい、アンパサンドについてのアイデアを得ます?)
  • つまり、 「(stderr)が既に/現在の1場所にリダイレクト(stdout)し、両方のストリーム2追加する」になります。

そして、常に覚えておいてください。リダイレクトのチェーンは、「最後から」、右から左へ(左から右ではなく)読み取る必要があります。


7

入力のリダイレクト

入力のリダイレクトにより、wordの展開から名前が付けられたファイルが開かれ、ファイル記述子n、またはnが指定されていない場合は標準入力(ファイル記述子0)が読み取られます。

入力をリダイレクトするための一般的な形式は次のとおりです。

[n]<word

出力のリダイレクト

出力のリダイレクトにより、wordの展開から名前が付けられたファイルが開かれ、ファイル記述子n、またはnが指定されていない場合は標準出力(ファイル記述子1)に書き込まれます。ファイルが存在しない場合は作成されます。存在する場合は、サイズがゼロに切り捨てられます。

出力をリダイレクトするための一般的な形式は次のとおりです。

[n]>word

ファイル記述子の移動

リダイレクト演算子、

[n]<&digit-

ファイル記述子の数字をファイル記述子nに移動します。nが指定されていない場合は、標準入力(ファイル記述子0)に移動します。数字はnに複製された後に閉じられます。

同様に、リダイレクト演算子

[n]>&digit-

ファイル記述子の数字をファイル記述子nに移動します。nが指定されていない場合は、標準出力(ファイル記述子1)に移動します。

参照:

man bash

入力/^REDIRECTしてredirectionセクションに移動し、詳細を確認します...

オンラインバージョンはこちらです:3.6リダイレクト

PS:

多くの場合、manLinuxを学ぶための強力なツールでした。


6

それ/fooがあなたのシステムに存在せず、そして/tmp

$ ls -l /tmp /foo

の内容を出力/tmpし、エラーメッセージを出力します/foo

$ ls -l /tmp /foo > /dev/null

内容を送信する/tmp/dev/nullとのエラーメッセージを出力/foo

$ ls -l /tmp /foo 1> /dev/null

まったく同じになります(1に注意してください)

$ ls -l /tmp /foo 2> /dev/null

の内容を印刷し/tmp、エラーメッセージを送信します/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

リストとエラーメッセージの両方を送信します /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

略記です


5

これは、エラーをstdoutまたは端末に渡すのと同じです。

つまりcmd、コマンドではありません。

$cmd 2>filename
cat filename

command not found

エラーは次のようにファイルに送信されます。

2>&1

標準エラーが端末に送信されます。


1

入力の場合は0、標準出力の場合は1、標準エラーの場合は2。

1つのヒントsomecmd >1.txt 2>&1正解ですが、somecmd 2>&1 >1.txtまったく効果がなく、間違いです!


1

unix_commands 2>&1

これは、エラーを端末に出力するために使用されます。

以下はプロセスを示しています

  • エラーが生成さ&2れると、標準エラーストリームが2参照する標準エラーメモリアドレス「バッファ」にエラーが書き込まれます。
  • 出力が生成さ&1れると、標準出力ストリームが1参照する標準出力メモリアドレス「バッファ」に書き込まれます。

したがって、unix_commands標準エラーストリームを受け取り、ストリームを(エラーの)標準出力メモリアドレスに2リダイレクト>&1て、ターミナルにストリーミングされて出力されるようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.