for循环中的bash stdout重定向

问题描述 投票:0回答:1

可能重复

你好,

我在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

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

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

如果我将> output_dir/result_X.dat替换为`2> / dev / null:不显示任何内容。

提前感谢。

bash loops stdout
1个回答
0
投票

启动my_tool时,该工具中通常有3个文件描述符:

  • STDIN
  • STDOUT
  • STDERR

STDIN用于输入,因此与该问题无关。 STDOUT用于标准输出。这是文件描述符1。如果执行

ls 1> /dev/null

ls的STDOUT写入/dev/null。如果不像在1中那样添加ls > /dev/null,则假定您的意思是STDOUT。

从广义上讲,

STDERR用作错误消息的标准输出。 STDERR的数量为2。

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

所以,总结一下,

ls . /non_existing_dir 2>stderr >stdout

.的目录列表放置在文件stdout中,将不存在的目录的错误放置在stderr中。

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

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

exec 3>file

将文件描述符3(新创建的)的输出放在file中。和

ls 1>&3

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

© www.soinside.com 2019 - 2024. All rights reserved.