我希望生成一个包含以下命令结果的输出文件:
cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done
我试过了:
cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; > output.txt; done
这会生成文件,但它是空白的。我也尝试过:
cd /path/to/files/; for each in *; do cat $each; echo "######_NEW_FILE_######"; done; >output.txt
这会生成一个太大的文件。这不是我想要的。 谢谢您的帮助。
答案 0 :(得分:3)
如果你想为一个命令块设置一个重定向,而没有子shell中涉及的性能影响和其他副作用,请将它放在大括号中:
{
cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done
} >output.txt
......作为一个单行,请务必在结束括号前加;
:
{ cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done; } >output.txt
顺便说一句,请注意它是cat "$each"
,而不是cat $each
。如果您使用touch '*'
创建了一个文件,那么您的输出大小就会翻倍。
那就是说,这确实非常接近与:
相同cd /path/to/files/; for each in *; do cat "$each"; echo "######_NEW_FILE_######"; done >output.txt
... >output.txt
适用于for
循环(仅适用于循环)。不一样的是,{ ... }
方法还重定向来自cd
命令的任何stdout(除非你用shell函数包装器或类似物重新定义,否则应该没有)。
也就是说:
# this does not redirect the header
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done >output
# this does not redirect the header or the loop
cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer >output
# this redirects everything
{ cd /path/to/files; echo "header"; for each in *; do cat "$each"; done; echo footer; } >output
答案 1 :(得分:1)
此:
... echo $each"######_NEW_FILE_######"; > output.txt
^---
您使用echo
终止;
,使> output.txt
语句完全独立于回声。
你想要
... echo '...' > output.txt; etc...
^---note
答案 2 :(得分:0)
done
后面的分号结束语句,这意味着重定向不与任何命令相关联。
丢失最后一个;
,它应该有效。