Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 重定向bash for循环的输出_Linux_Bash_Shell - Fatal编程技术网

Linux 重定向bash for循环的输出

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

我有一个简单的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 > 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;