我试图将 stderr 重定向到 stdout,然后重定向到 init 脚本中的文件,但是当我将 stderr 引入到 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 &
任何意见,将不胜感激。
答案1
如果您正在运行 (t)csh,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
、常规参数2
和重定向到1
,并且重定向发生冲突,因此您会收到错误。
>&
也适用于 Bash 和 zsh,但不是标准功能。
答案2
第二个条目应该可以正常工作。如果您在不应该存在的空格中存在空格,或者相反,当缺少重要空格时,有时会发生“不明确的重定向”错误。
我会简化你的命令来演示:
echo "Test" >/tmp/x.txt 2>&1 &
">/tmp/x.txt" 部分将重定向 stdout(文件句柄 #1)。 > 和文件名之间允许有空格(尽管在这种情况下会令人困惑),但否则此处不应有任何空格。
2>&1 会将 stderr(文件句柄 2)重定向到文件句柄 1 所在的位置(即 stdout)。这里也不能有任何空格。
& 将为您的任务提供背景。它必须与前一个字符偏移一个空格。
反转两个重定向不起作用(尽管 echo 在这里是一个糟糕的选择,因为它不会产生 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 在评论中指出这实际上是有效的语法。