正确的语法以避免 bash 的“歧义重定向”消息

vfc*_*sts 3 bash io-redirection

我正在尝试执行一个累积stdout到现有文件中的命令,并使用以下命令将错误消息发送给另一个文件。

commmand >> /home/user/accumulate_output.log 2>& /home/user/error.log 这给出了这个错误信息

bash: /home/user/error.log :ambiguous redirect

什么是正确的语法?

ori*_*ion 5

2>&1意味着将错误流重定向到标准输出和&字符本身并没有多大意义:它正在等待您提供多个文件描述符,但您正在为他提供一个文件名。你想重定向到文件,而不是一个编号的文件描述符,所以

commmand >> /home/user/accumulate_output.log 2>/home/user/error.log
Run Code Online (Sandbox Code Playgroud)

您可以理解&1&2作为“文件名”,指的是 stdout 和 stderr 的文件描述符。现在你看到&在文件名前面没有意义。

总之,语法 is n>&mor n>filewhere nis 要重定向的文件描述符(如果未指定,则表示标准输出,n=1),在右侧,您可以重定向到 file descriptor m,或具有 name 的文件filem可以是一个数字,或者-这意味着应该关闭文件描述符而不是重定向(重定向“无处”)。

还有一种特殊的语法可以将 stdout 和 stderr 重定向到同一个位置,但那是&>. 它只会让您感到困惑,因为它不属于常规语法 - 它是一种实际上一次执行两次重定向的快捷方式。