回答这个问题使我又问了一个问题:
我认为以下脚本可以做同样的事情,第二个脚本应该更快,因为第一个脚本cat
需要一遍又一遍地打开文件,而第二个脚本仅可以打开文件一次然后回显一个变量:
(请参阅更新部分以获取正确的代码。)
第一:
#!/bin/sh
for j in seq 10; do
cat input
done >> output
第二:
#!/bin/sh
i=`cat input`
for j in seq 10; do
echo $i
done >> output
而输入约为50兆字节。
但是当我尝试第二个时,它太慢了,因为回显变量i
是一个巨大的过程。第二个脚本也有一些问题,例如输出文件的大小比预期的要小。
我还检查了的手册页echo
并cat
进行比较:
回声-显示一行文本
cat-连接文件并在标准输出上打印
但是我没有区别。
所以:
- 为什么第二个脚本中的cat这么快而echo这么慢?
- 还是变量问题
i
?(因为在手册页中echo
据说它显示“一行文本”,所以我猜它仅针对短变量进行了优化,而不是针对非常长的变量进行了优化i
。但是,这只是一个猜测。) - 为什么使用时会出问题
echo
?
更新
我用seq 10
而不是`seq 10`
不正确。这是编辑的代码:
第一:
#!/bin/sh
for j in `seq 10`; do
cat input
done >> output
第二:
#!/bin/sh
i=`cat input`
for j in `seq 10`; do
echo $i
done >> output
(特别感谢roaima。)
但是,这不是问题的重点。即使循环只发生一次,我也会遇到相同的问题:cat
比的运行速度快得多echo
。
echo
速度更快。您所缺少的是,通过使用变量时不引用变量,使shell做太多的工作。
printf '%s' "$i"
,不是echo $i
。@cuonglm在回答中很好地解释了回声的一些问题。对于为什么即使报价是在某些情况下,与之呼应不够,看unix.stackexchange.com/questions/65803/...
cat $(for i in $(seq 1 10); do echo "input"; done) >> output
呢?:)