リダイレクトの使用方法を思い出すにはどうすればよいですか?


40

私は何を知っている

  program > /dev/null 2>&1 

します。それはへの出力をリダイレクト/dev/nullし、2>&1出力が送信された同じ場所にエラー出力をリダイレクトするための手段。

私の問題は、それを覚えていないので、常にグーグルで検索する必要があることです。

だから、私がしようと&2>11>2&1>&2私はそれをグーグルまで...私はすべての組み合わせを試してみてください...

簡単に覚えるコツは何ですか?


私は同じ問題を抱えているので、「長い」方法でやります-両方をリダイレクトしprogram 1> /dev/null 2>/dev/nullます。あなたが混在する必要がありますけれども、いくつかの時間stdoutstderr複雑なコンパイルプロセスからの出力のようにファイルにリダイレクトされている-実際に何が起こっているかを確認するために一緒に。その場合、私はそれをグーグルで
調べる

回答:


20

出力はエラーよりも優れているため、最初に出力されます(1対2)。

>「goes to」の省略形です。左側が送信したいもので、右側が送信したい場所です。'where'は(ほとんど)常にファイルなので、

program > /dev/null 2>1

1という名前のファイルにリダイレクトします。したがって、アンパサンド(&)はファイルをファイル記述子に変更します。

残念ながら、私は自分のニーモニックに出会ったり開発したりしていませんが、* nixを初めて学んだとき、この論理的な方法がうまく機能することを発見しました。数回実行すると、2番目の性質になります。


最初の文は私には意味がありません。 stdoutファイル記述子1 stderrは2です。したがって、「エラー」は「出力」の前に来ます。
ウォーレンヤング

その文は、どのファイル記述子stdoutstderr参照して参照するかを覚えるニーモニックです。
gvkv

わかりましたが、元の質問は「2>&1」呪文のキャラクターの順序を覚えようとすることに関するものであるため、依然として混乱しているようです。
ウォーレンヤング

9

1つのトリックは、1 =標準出力、2 =標準エラーであることを覚えておくだけです。そう:

2>&1=標準エラーストリームは標準出力ストリームに入ります。
1>&2=その逆。

Cに似た言語でプログラミングしたことがある場合は、アンパサンド(&)を覚えやすくなります。ファイル自体を変更したり、新しいファイル記述子を作成したりしないように、既存のファイル記述子の「アドレス」を参照していると考えることを選択します。


7

&結び目として見ると役立つ場合があります:2の出力を取得するので2>、何をしたいのかを考えてください。2>&1


2
「ツーアウトアンドワン」というフレーズを覚えました。ニーモニックがフレーズであれ結び目であれ、持っていると本当に助かります。
ティムケネディ

5

実際には、使用しているシェルによって異なります。Bashは通常非常に寛容であり、次のことができます。

program &> file

5

次の3つのオプションについて考えてみましょう。

program  2>1
program  2>1& 
program  2>&1

最初はstderrをファイル名「1」に送信します。結局、bashはファイルにリダイレクトすることを期待しています。

2番目も同じファイルにリダイレクトしますがprogram、バックグラウンドで実行されます。つまり、末尾&が意味するはずです。

これは、ファイルハンドルへのリダイレクトに関してbashユニバースで意味をなす唯一のものとして、3番目の可能性を残します。

0、1、2のどれがどれであるかを覚える方法は?コンソールからコンピューターを実行することを考えてください。まず、何かを入力する必要があります(0 = stdin)。次に、出力が表示されます(1 = stdout)。最後に、何か問題が発生した場合にのみ、stderr(2)が表示されます。


1

壁紙に描いてください。

真剣に、これやその他の基本的なことは忘れていたので、開発したアプリと毎日使用するアプリに簡単なヒントメニューを追加しました。試してみるか、gnoteのようなものを使用してメモをとってください。


1

bashシェルに関しては、何が起きているのかを理解することが最良の記憶方法です。
コマンドを正しく取得する方法を覚えているだけでよい場合は、試してみてください

program > /results 2> /results

それは素晴らしいことであり、明らかなことであり、覚えやすいものです。すなわち

  • 1 STDOUTは /results
  • 2STDERRも起こっている直接/results

問題は、これが期待どおりに機能しないことです。以下を考慮してください。

ファイル: /tmp/poem.txt

the quick brown fox jumped over the lazy dog

そして、コマンドを実行します

grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results

それから

$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
 lazy dog

ここで何が起こったの?
私の理解は、STDERRを直接ファイルに向けるリダイレクト/tmp/resultsと、その性質のために>2つのことを行うbashセットアップです

  1. 通常、新しいファイルを作成します-この場合、bashは出力が生成されたときにこのルーチンを通過したため、機会は過ぎました。
  2. ファイルの先頭に直接挿入します。のように追加>>しません。

したがって、この場合はSTDERRは、/tmp/resultsSTDOUTの出力をオーバーライドする先頭に直接挿入します。
注:>>追加に使用したことがある場合は、おそらくこの構文で回避できます。
ただし、STDERRをファイルに直接リダイレクトするのではなく、STDERRの出力をSTDOUTストリームにマージして、衝突が発生しないようにする必要があります。
オペレーター2>&1operator を使用してこれを実現します

grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1

これ&により、bashは、指定されたファイル1および1ファイル記述子と区別でき ます。
私には、ステートメント2>&1自体が何が起こっているのかを正確に説明しています-STDERRはSTDOUT自体にリダイレクトされています-そして/tmp/results、STDOUTがポイントされているので(ほとんど副作用として)終わるだけです。
多くのガイドが主張するものとは対照的に、2>&1STDOUTが指し示されている場所にSTDERRを送信します。それが本当だった場合-あなたはまだ上書きの問題を抱えているでしょう。

詳細については、http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirectionを参照してください。

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