可能重复
你好,
我在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:不显示任何内容。
提前感谢。
启动my_tool
时,该工具中通常有3个文件描述符:
STDIN用于输入,因此与该问题无关。 STDOUT用于标准输出。这是文件描述符1。如果执行
ls 1> /dev/null
ls的STDOUT写入/dev/null
。如果不像在1
中那样添加ls > /dev/null
,则假定您的意思是STDOUT。
STDERR用作错误消息的标准输出。 STDERR的数量为2。
使用ls
而不是您的my_command
,ls > 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
。