我希望将一个
printf
命令的输出重定向到 stderr
,而不是 stdout
。我并不想将当前路由的 stderr
或 stdout
重定向。我尝试了一下,发现在 printf
命令后追加 1>&2
可以实现目标。但是,我没有使用过 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
,然后再被写入文件。但实际情况并非如此。怎么回事?
2>errors.txt 1>&2
确实是我本来想要使用的。回过头来看,我感到有些愚蠢,但这似乎是我不得不一直犯错,直到正确的方法变得“明显”为止的那种傻瓜错误。;-) 非常感谢您的见解。 - irrational John