プログラムはSTDOUT / STDERR以外の場所にどのように出力しますか?それを避ける方法は?


15

どうやら、使用可能なすべての出力先がわからないようです。stdout&1)とstderr&2)について知っています。ただし、両方の記述子をリダイレクトした後でも、コンソールに出力が表示されることがあります!

私が考えることができる最も簡単な例はGNU Parallelです。使用するたびに、引用通知が表示されます。行っても&2>1 > file、通知が表示されます。

そして同じことが当てはまりemergeます。emergeを実行していくつかの問題が発生した場合、一部の情報はにも出力されstdoutませんstdin

私は主にを使用してこれらの問題を解決しますscriptが、この問題の原因は何だと思います。


1
完全な例を提供してください。
クサラナナンダ


8
あなたはそれらすべてを手に入れることはありません。スクリプトは常にに書き込むことができ/dev/ttyます。
桂佐藤

1
GNUに関してはparallelmkdir ~/.parallel; touch ~/.parallel/will-cite迷惑なメッセージを無効にします。または、の他の実装を探してくださいparallel
桂佐藤

2
@OleTangeそれは問題ではないからです-私は何かが起こっている理由を尋ねているparallelので、例として使用しています。
マシューロック

回答:


40

使用した構文が間違っています。

cmd &2>1 >file

として分割されます

cmd &
2>1 >file

この意志:

  1. cmdリダイレクトなしでバックグラウンドジョブとして実行する
  2. 別のプロセス(コマンドなし!)でstderr、文字通り呼び出されるファイルに1リダイレクトstdoutし、file

必要な構文は次のとおりです。

cmd >file 2>&1

操作の順序は重要です。この意志:

  1. リダイレクトstdoutfile
  2. リダイレクトstderrする&1-すなわち、同じファイルハンドルなどstdout

結果は、両方のことであるstderrとはstdoutにリダイレクトされますfile

ではbash、より単純な非標準の(したがって、移植性の理由でお勧めしません)構文cmd &> fileも同じことを行います。


よかった、ありがとう。他の問題はかもしれませんが/dev/tty、これがあまり頻繁に起こらないことを願っています(もしあれば)。
マシューロック

5
atマシンにコマンドがあり、それを使用する権限がある場合は、を介してコマンドを実行できますat now。詳細については、マンページを参照してください。これにより、バッチプロセスメカニズムを介してコマンドが実行され、プロセスに書き込むttyがなくなります。しかし、一般的に、私はこのエッジケースについて心配しません。通常、対話を必要とするプロセスのみを使用し、リダイレクトにもかかわらずユーザーに物事を表示する必要があります/dev/tty
スティーブンハリス

そこにいた、それをやった
-davidbak

10

2つの問題があります。

1つ目は順序が重要であること、2つ目は/dev/ttyです。

このスクリプトを、出力をキャプチャするスクリプトの例として使用してみましょう。

test.sh

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

次に、コマンドの出力を見てみましょう。

./testmyscript.sh 2>&1 >/dev/null

edada
ttdada

評価の順序は左から右であるため、最初に「出力先(コンソール出力)stderrへのリダイレクト」を取得しstdoutます。その後、「リダイレクトstdout/dev/nullます。次のような状況になります。

stdout-> /dev/null stderr->コンソール

だから私たちはそれを正しく理解します:

./testmyscript.sh >/dev/null 2>&1

そして、我々は得る:

ttdada

今、私たちは「リダイレクトを行うstdout/dev/nullし、」、および「stdoutが指している場所へのリダイレクト標準エラー出力」(そうが、/dev/null)。ほら!

ただし、まだ問題があります。プログラムはに出力し/dev/ttyます。今、私はこの種の振る舞いを修正する方法を知らないので、あなたはおそらく必要scriptになるでしょうが、うまくいけば、この振る舞いはあまり頻繁に起こらないでしょう。

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