web-dev-qa-db-ja.com

リダイレクションの使い方を思い出せますか?

いい考えがある

  program > /dev/null 2>&1 

します。出力を/dev/nullにリダイレクトし、2>&1は、出力が送信されるのと同じ場所にエラー出力をリダイレクトすることを意味します。

私の問題は、覚えていないため、常にグーグルする必要があることです。

だから、私は&2>11>2&1>&2を試してみる...グーグルするまですべての組み合わせを試してみる...

簡単に覚えるコツは?

43
Luc M

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

>は「行く」の省略形です。左側は送信したいもので、右側は送信したい場所です。 「どこ」は(ほとんど)常にファイルなので、次のようなものです

program > /dev/null 2>1

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

残念ながら、私は自分自身のニーモニックに出会ったことも開発したこともありませんが、* nixを初めて学んだときに、この論理的な方法がうまく機能することを発見しました。何度か試してみると、それは第二の性質になります。

21
gvkv

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

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

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

10
Thronic

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

7

次の3つのオプションを検討してみましょう。

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

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

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

3番目の可能性は、ファイルハンドルにリダイレクトするためのbashユニバースで意味のある唯一のものです。

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

5
John1024

あなたの壁紙にそれを描きます。

真剣に、これと他の基本的なものを忘れていたので、私が開発し、毎日使用するアプリにクイックヒントメニューを追加しました。あなたはそれを試してみるか、メモを保持するためにgnoteのようなものを使用したいかもしれません。

1
Eldelshell

Bashシェルに関しては、何が起こっているのかを理解することで覚えるのが最善の方法です。
コマンドを正しく取得する方法を覚えているだけの場合は、

_program > /results 2> /results
_

それがいいことであり、何が起こっているのかがわかりやすく、覚えやすいです。つまり.

  • _1_ STDOUTは_/results_に
  • _2_ STDERRも_/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
_

ここで何が起こったのですか?
私の理解は、bashセットアップがSTDERRを直接にファイル_/tmp/results_を指すようにリダイレクトすることと、_>_は2つのことを行います

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

したがって、この場合はSTDERRであり、STDOUTの出力を上書きして_/tmp/results_の先頭に直接挿入します。
注:_>>_を使用して追加した場合は、おそらくこの構文で回避できます。
必要な問題を修正するには-STDERRをファイルに直接リダイレクトするのではなく、mergeSTDERRの出力をSTDOUTにリダイレクトするストリームなので、衝突は発生しません。
演算子_2>&1_演算子を使用すると、これを実現できます

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

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

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

1
the_velour_fog

2>&1を、stdout(1)が現在になる場所にリダイレクトするstderr(2)としてリダイレクトします。

左から右へ(そして処理されて)読みます。 >file 2>&1の正しい読み取りは、stdoutをファイルに直接送信し、次にstderrがstdoutを実行しているのと同じ場所に送信します。

0
ctrl-alt-delor