web-dev-qa-db-ja.com

あいまいな出力リダイレクト

Stderrをstdoutにリダイレクトしてから、initスクリプトのファイルにリダイレクトしようとしていますが、stderrをstdoutに導入すると、「あいまいな出力リダイレクト」エラーが発生します。 stdoutだけではエラーは発生せず、私が述べたログファイルに書き込みます。私は以下を試しました

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar &>/jbeaulau_test/microservices/log/all.log &

-jar /jbeaulau_test/microservices/config-server-0.0.2-RELEASE.jar >/jbeaulau_test/microservices/log/all.log 2>&1 &

任意のアドバイスをいただければ幸いです。

2
jbeaulau

(t)cshを実行している場合、2つの競合するリダイレクトを設定しようとすると、Ambiguous output redirect.が表示されます。

> echo foo > a > b
Ambiguous output redirect.

Bashでは、ファイル名の代わりに複数の要素を持つ配列を使用すると、同様のエラーが発生する可能性があります。

$ set aa bb
$ echo foo > "$@"
bash: "$@": ambiguous redirect

stderrリダイレクトがcshでは機能しない の回答で述べたように、>&演算子は(t)cshで機能し、stdoutとstderrの両方をリダイレクトします。 2>&1は、stderrをstdoutと同じ場所にリダイレクトする標準的な方法ですが、(t)cshはこれをサポートしていません。代わりに、> foo 2>&1の組み合わせをfooへのリダイレクト、通常の引数21へのリダイレクトとして受け取り、リダイレクトが競合するため、リダイレクトが取得されますエラー。

>&はBashとzshでも機能しますが、標準機能ではありません。

4
ilkkachu

2番目のエントリは正常に機能するはずです。 「あいまいなリダイレクト」エラーは、本来あるべきでないスペースがある場合、または逆に重要なスペースがない場合に発生します。

私はあなたのコマンドを簡単に説明します:

echo "Test" >/tmp/x.txt 2>&1 &

"> /tmp/x.txt"の部分はstdout(ファイルハンドル#1)をリダイレクトします。 >とファイル名の間のスペースは許可されます(ただし、このコンテキストでは混乱を招きます)が、それ以外の場合はここにスペースを入れないでください。

2>&1は、stderr(ファイルハンドル2)を1が移動するファイルハンドル(stdout)にリダイレクトします。ここにもスペースがあってはいけません。

&はタスクの背景を表示します。これは、先行する文字からのスペースでオフセットする必要があります。

2つのリダイレクトを元に戻すことはできません(ただし、エコーはstderr出力を生成しないため、ここではエコーを選択することはできません)。

echo "This will not work" 2>&1 >/tmp/x.txt &

これの意味は:

2>&1

ファイルハンドル2をファイルハンドル1の移動先にリダイレクトします(この時点ではまだコンソールです)。

>/tmp/x.txt

ファイルハンドル1をファイルにリダイレクトします。ただし、ファイルハンドル2(stderr)は既にこの時点でリダイレクトされるため、宛先を保持したまま、コンソールに移動します。

あなたが書いた最初のコマンドは、単に構文エラーです。

echo &>/tmp/x.txt

更新:@Wildcardは、これが実際に有効な構文であることをコメントで指摘しました。

0
Kevin Keane