gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:42:49 24 4
gpt4 key购买 nike

我想将 bash 脚本中的 printf 的输出定向到 stderr 而不是 stdout

询问是否要从当前路由的位置重定向stderrstdout。我只是希望能够将 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 是正确的做法。

其次,您的 1>&2 2>errors.txt 示例不起作用的原因是重定向的具体细节。

1>&2 的意思是“使文件句柄 1 指向文件句柄 2 当前所在的位置”——即本应写入 stdout 的内容现在转到 stderr。 2>errors.txt 表示“打开一个文件句柄到 errors.txt 并使文件句柄 2 指向它”——也就是说,本来应该写入 stderr 的内容现在进入了 错误.txt。但是文件句柄 1 根本不受影响,所以写入 stdout 的内容仍然会转到 stderr。

正确的做法是 2>errors.txt 1>&2,这将使对 stderr 和 stdout 的写入都转到 errors.txt,因为第一个操作将是“打开 errors.txt 并使 stderr 指向它”,第二个操作将是“使 stdout 指向 stderr 现在指向的位置”。

关于bash - 我应该使用什么方法在 bash 脚本中使用 'stderr' 将错误消息写入 'printf'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com