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 &
アドバイスをいただければ幸いです。
コメント
回答
(t)cshを実行している場合は、Ambiguous output redirect.
2つの競合するリダイレクトを設定しようとすると:
> 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
であり、リダイレクトが競合するため、エラーが発生します。
>&
はBashとzshでも機能しますが、標準機能ではありません。
回答
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は、これが実際に有効な構文であるとコメントで指摘しました。
コメント
-
The ">/tmp/x.txt" part will redirect stdout (file handle #1). It must not contain any spaces.
。スペースを含めることができます。command >out.txt
==command > out.txt
- その通りです。私はそこで間違えました。修正します。
- "最初に記述したコマンドは単に構文エラーです。"いいえ、'ではありません。 'は、stdoutとstderrの両方をリダイレクトするための優先 Bash構文です。
LESS='+/Redirecting Standard Output and Standard Error' man bash
- @Wildcardを参照してください-ありがとう。私は学ぶのをやめません!
echo &> foo
で問題を実証できます。 (2)必要がない場合は、非同期のコマンドの例を示しないでください。 (3)シェルについて学びます。 Unixverseには複数のシェルがあり、それらは異なるコマンド構文を受け入れます。使用しているシェルを確認する方法を学びます。