从这里: http : //www.sat.dundee.ac.uk/psc/watchdog/watchdog-testing.html
for n in $(seq 1 60); do echo $n; sleep 1; sync; done
我得到:
:~$ sudo for n in $(seq 1 60); do echo $n; sleep 1; sync; done bash: syntax error near unexpected token `do'
shell解析命令行,因为看起来像一个sudo
的参数,你基本上得到一个没有for
。
要修复它,在一个子shell中运行循环,或者作为一个单独的脚本,或者像这样;
sudo sh -c 'for n in $(seq 1 60); do echo $n; sleep 1; sync; done'
更好的是,避免运行任何不必要的特权用户:
for n in $(seq 1 60); do echo $n; sleep 1; sudo sync; done
第一个sudo
将需要一个密码,但后续迭代应该缓存,大多数发行版默认设置。
for
是一个内部函数(不要与函数混淆),这就是为什么你不能调用它的原因。 你应该明确地调用与这样的代码运行的shell的二进制文件:
sudo sh -c 'for n in $(seq 1 60); do echo "$n"; sleep 1; sync; done'
用bash:
sudo bash -c 'for n in {1..60}; do echo "$n"; sleep 1; sync; done' sudo bash -c 'for ((n = 1; n <= 60; ++n)); do echo "$n"; sleep 1; sync; done'
这是因为第一个分号终止了sudo
命令,这将会do
一个新的命令。 解决这个问题的最简单的方法就是将循环放在一个文件中并执行它
sudo /bin/bash ./myfile