3

Subversion post-commit hookを作成しています。post-commit フックがメッセージをマーシャリングしてクライアントに戻すように、1 つのコマンドの出力を強制的に STDERR にする必要があります。

STDOUT を STDERR に強制するにはどうすればよいですか?

この簡単な例では、ファイルfooは存在しますが、存在barしません。

# touch foo
# ls foo bar
ls: bar: No such file or directory
foo

STDOUTをSTDERRに送信したい。でこれができると思った>&2のですが、うまくいかないようです。

次の例では、STDOUT を STDERR にリダイレクトすることを期待してい/tmp/testました。これには、コマンドの出力とエラーが含まれます。しかし、代わりに、STDOUT が STDERR にリダイレクトされることはなく/tmp/test、コマンドからのエラーのみが含まれているようです。

# ls foo bar >&2 2>/tmp/test
foo
# cat /tmp/test
ls: bar: No such file or directory

私は何が欠けていますか?

CentOS、Ubuntu、FreeBSD、および MacOSX で上記の例を試しました。

4

2 に答える 2

9

シェル リダイレクトは、一度に 1 つずつ、左から右に評価されます。したがって、次の場合:

# ls foo bar >&2 2>/tmp/test

その FIRST は stdout を stderr にリダイレクトし (最初は何であれ -- おそらく端末)、THEN は stderr を /tmp/test にリダイレクトします。そのため、stdout は、ファイルではなく、stderr が最初に指していたものを指したままになります。あなたがしたい

# ls foo bar 2>/tmp/test >&2

最初に stderr をファイルにリダイレクトし、次に stdout を同じ場所にリダイレクトします。

于 2012-05-08T00:09:26.720 に答える
-2

STDOUT には番号 1 のファイル記述子があり、これも指定する必要があります。つまり、1 が欠けているだけです。

$ ls bar 1>&2 2>test
$ cat test
ls: cannot access bar: No such file or directory

bash の man ページの REDIRECTIONS から:-

Appending Standard Output and Standard Error
   This construct allows both the standard output (file descriptor 1) and the standard error output (file descriptor 2) to be appended to the
   file whose name is the expansion of word.

   The format for appending standard output and standard error is:

          &>>word

   This is semantically equivalent to

          >>word 2>&1
于 2012-05-07T23:21:40.853 に答える