我想将bash脚本中的printf的输出引导到stderr而不是stdout。
我不是要求从目前路由的任何一个重定向到stderr或stdout。我只是希望能够将输出从printf发送到stderr,而不是默认的stdout。
我尝试了一下,发现将1>& 2添加到printf,如下面的示例所示,似乎是我想做的。但是,我没有使用bash的经验。所以我的主要问题是在bash中是否有更好的方法呢?
通过“更好”我的意思是有另一种方法来做这个更常用,更常规或更习惯的方式吗?一个更有经验的bash程序员会怎么做?
#!/bin/bash printf "{%s} This should go to stderr.\n" "$(date)" 1>&2 printf "[(%s)] This should go to stdout.\n" "$(date)"
我也有次要的问题。我不是要求它,因为我需要知道,但更多的是因为我只是好奇,想更好地了解发生了什么。
似乎上面的内容只有在shell脚本中运行时才有效。当我从命令行尝试它似乎不起作用。
这是我的意思的一个例子。
irrational@VBx64:~$ printf "{%s} Sent to stderr.\n" "$(date)" 1>&2 2> errors.txt {Sat Jun 9 14:08:46 EDT 2012} Sent to stderr. irrational@VBx64:~$ ls -l errors.txt -rw-rw-r-- 1 irrational irrational 0 Jun 9 14:39 errors.txt
首先,是的,1& 2& 2是正确的事情。
原文链接:https://www.f2er.com/bash/387849.html第二,您的1>& 2> errors.txt示例不起作用的原因是因为重定向的确切细节。
1& 2意味着“使文件句柄1指向当前文件句柄2” – 即将已经写入stdout的内容现在转到stderr。 2> errors.txt意味着“打开一个文件句柄到errors.txt并使文件句柄2指向它” – 即将已经写入stderr的内容现在进入errors.txt。但是文件句柄1根本没有受到影响,所以写入stdout的东西仍然是stderr。
正确的做法是2> errors.txt 1>& 2,这将使stderr和stdout的写入都转到errors.txt,因为第一个操作将是“打开errors.txt并使stderr指向” ,第二个操作将“stdout指向stderr现在指向的地方”。