Linux 重定向bash for循环的输出
我有一个简单的BASH命令Linux 重定向bash for循环的输出,linux,bash,shell,Linux,Bash,Shell,我有一个简单的BASH命令 for i in `seq 2`; do echo $i; done; > out.dat 当运行时,seq 2的输出输出到终端,数据文件(out.dat)没有输出任何内容 我希望standard out被重定向到out.dat,就像它只运行命令out.dat一样,请尝试: (for i in `seq 2`; do echo $i; done;) > out.dat 删除分号 for i in `seq 2`; do echo "$i"; done
for i in `seq 2`; do echo $i; done; > out.dat
当运行时,seq 2
的输出输出到终端,数据文件(out.dat)没有输出任何内容
我希望standard out被重定向到out.dat,就像它只运行命令out.dat一样,请尝试:
(for i in `seq 2`; do echo $i; done;) > out.dat
删除分号
for i in `seq 2`; do echo "$i"; done > out.dat
建议
正如Fredrik Pihl所建议的,在不需要外部二进制文件时,或者至少在实际上不需要时,尽量不要使用外部二进制文件:
for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat
将显示您的文件,而不仅仅是文本*
与backticks(`
)相比,$()
还被推荐为Bash和POSIX shell中命令替换的更清晰语法,并且它支持嵌套
用于将输出读取到变量的更干净的解决方案是
while read VAR; do
...
done < <(do something)
另一种可能性是,为了完整性:您可以在循环中移动输出,使用
>
附加到文件(如果存在)
for i in `seq 2`; do echo $i >> out.dat; done;
哪一个更好当然取决于用例。一次编写文件肯定比一千次追加文件要好。此外,如果循环包含多个
echo
语句,所有这些语句都将进入文件,那么执行done>out.dat
可能更可读,也更易于维护。当然,此解决方案的优点是它提供了更大的灵活性。无需将其放置在子shell上。要使重定向成为块的一部分,只需删除分号。确实,在这种情况下,只需删除分号即可。Subshell,()可用于收集大量命令的输出,例如多个for-loops。无法找到有关stackoverflow的好的Subshell文章。这里有一个外部命令:@svante我同意将它括起来以获得更多命令,但是您也可以使用{}
这样做,因为不需要为子shell创建另一个进程,也不需要从较高的块保留变量更改。只有在无法帮助的情况下,才会将它们放置在管道上,因为默认情况下它们放置在子shell上,不设置laspipe,命令位于末尾,尽管使用进程替换是一种方法;这里的子shell是没有意义的。在循环外执行单个重定向对性能肯定更好。为什么seq
而不是对于{1..2}中的i;做…
?@FredrikPihl是的,更好。或者((i=1;我只是想你可以用另一种更好的方法来更新你的答案,而不必使用外部二进制文件:-)@FredrikPihl好吧,这与问题没有真正的联系,更像是一个建议,但我还是做了一个更新。这个例子让我意识到,我可以通过管道将done
语句传递到其他事情,比如sort
,例如for I in foo bar baz;do echo$I | base64;done | sort | base64-d
read ... < <(do something) ## Could be done on a loop or with readarray.
for A in "${ARRAY[@]}"; do
:
done
printf '%s\n' {1..2} > out.dat
for i in `seq 2`; do echo $i >> out.dat; done;