为什么以下命令的标准输出会有所不同?
命令1:
for ((i=0; i<10; i=i+1)); do echo $i; done
命令2:
bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"
command1按预期在单独的行上打印整数1到10。 command2在每一行打印10个。
我需要做什么才能让command2打印与command1相同的东西?
长篇故事:
我经常需要在大量文件上运行可执行文件并捕获整个进程的输出。我在名为my_script.sh的单独文件中使用类似于command1的for循环。
然后我可以使用:
获取输出bash my_script.sh > results.txt
因为为简单的for循环创建一个单独的my_script.sh文件有点痛苦,我希望通过使用“bash -c”来实现同样的目的,但遇到了这个问题。
感谢您的任何建议。期待回复。
米莎
答案 0 :(得分:10)
我需要做什么才能让command2打印与command1相同的东西?
你需要修改这一行:
bash -c "for ((i=0; i<10; i=i+1)); do echo $i; done"
这样说:
bash -c "for ((i=0; i<10; i=i+1)); do echo \$i; done"
正在发生的是$i
序列正由您正在运行bash的shell解释,它在传递之前将自己的 i
变量替换为字符串它将关闭到要执行的新bash实例。所以当新的bash看到字符串时,它是:
for ((i=0; i<10; i=i+1)); do echo 10; done
假设i
包含值“10”。
(当我第一次运行第二个脚本时,我在运行第一个脚本之前,它写出了10个空白行,因为我没有定义i
变量,所以它在空字符串中替换。)