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_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
将文件描述符 2 (STDERR) 的输出重定向到文件描述符 1 (SDTOUT)。
为了使事情复杂一点,您可以添加其他文件描述符编号。例如:
exec 3>file
会将文件描述符 3(新创建的)的输出放入 file
。并且
ls 1>&3
然后将文件描述符 1 的输出重定向到文件描述符 3,有效地将 ls
的输出放入 file
。
可能重复
您好,
我正在努力处理 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_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
将文件描述符 2 (STDERR) 的输出重定向到文件描述符 1 (SDTOUT)。
为了使事情复杂一点,您可以添加其他文件描述符编号。例如:
exec 3>file
会将文件描述符 3(新创建的)的输出放入 file
。并且
ls 1>&3
然后将文件描述符 1 的输出重定向到文件描述符 3,有效地将 ls
的输出放入 file
。