我应该用什么方法在bash脚本中使用’printf’将错误消息写入’stderr’?

前端之家收集整理的这篇文章主要介绍了我应该用什么方法在bash脚本中使用’printf’将错误消息写入’stderr’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想将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

我会期望上面的printf命令没有输出,因为输出应该去stderr,反过来应该去一个文件。但这不会发生。咦?

首先,是的,1& 2& 2是正确的事情。

第二,您的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现在指向的地方”。

原文链接:https://www.f2er.com/bash/387849.html

猜你在找的Bash相关文章