bash for 循环中的标准输出重定向

bash stdout redirection in a for loop

可能重复

您好,

我正在努力处理 bash for 循环中的输出重定向。我有几个类似的 bash 脚本,每个脚本都在不同的输入文件上启动。脚本调用带有几个参数的工具。

bash 脚本是这样的:

my_tool --input input_file --arg1 arg1_name --arg2 arg2_name > output_dir/result_X.dat

X 是每个脚本唯一的字符串。

我运行所有这些都在一个for循环中:

for script in scripts_dir/*.sh
do
    bash $script
done

但是,每个 运行 的标准输出仍然显示在终端上。指定的输出文件已创建,但为空。我该如何解决?我在 Whosebug 上发现了其他问题,答案是在一个大输出文件中重定向完整循环,但我想避免这种情况。

如果我用 > /dev/null 替换 > output_dir/result_X.dat :标准输出显示在终端上

如果我将 > output_dir/result_X.dat 替换为 ` 2> /dev/null :什么都不显示。

提前致谢。

当您启动 my_tool 时,工具中通常有 3 个可用的文件描述符:

  • 标准输入
  • 标准输出
  • 标准错误

STDIN 用于输入,因此与本题无关。 STDOUT 用于标准输出。这是文件描述符 1。如果你这样做

ls 1> /dev/null

ls 的 STDOUT 被写入 /dev/null。如果您不添加 1,如 ls > /dev/null,则假定您指的是 STDOUT。

从广义上讲,STDERR 用作错误消息的标准输出。 STDERR 的数量是 2。

使用 ls 而不是您的 my_commandls > file 会将列表放入 filels /non_existing_dir_ > file 会将 ls 的 STDOUT 放在 file 中。但是 STDOUT 上没有输出,因为 STDERR 没有被重定向,所以它会被发送到终端。

所以,总而言之,

ls . /non_existing_dir 2>stderr >stdout

会将 . 的目录列表放入文件 stdout 中,并将不存在目录的错误放入 stderr.

使用 2>&1 将文件描述符 2 (STDERR) 的输出重定向到文件描述符 1 (SDTOUT)。

为了使事情复杂一点,您可以添加其他文件描述符编号。例如:

exec 3>file

会将文件描述符 3(新创建的)的输出放入 file。并且

ls 1>&3

然后将文件描述符 1 的输出重定向到文件描述符 3,有效地将 ls 的输出放入 file