使用sudo运行时出现“语法错误,附近的未预期令牌'do'”

5
3个回答

9

Shell会解析命令行,由于for看起来像是sudo的一个参数,因此你实际上得到了一个没有fordo

为了解决这个问题,可以在子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需要密码,但后续的操作应该使用缓存的密码,在大多数发行版的默认设置中。

如果你在Bash上,你可以使用{1..60}代替$(seq 1 60)。显然,如果你想在第一个示例中的单引号中使用Bash特定的语法,你需要使用bash -c而不是sh -c


2

for 是 shell 的内部函数(不要与函数混淆),因此您无法调用它。您应该显式地调用运行代码的 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'

1
这是因为第一个分号结束了sudo命令,将使得do成为一个新的命令。最简单的修复方法是将循环放入文件中并执行,例如:
sudo /bin/bash ./myfile

我在谈论终端命令。分号应该放在哪里? - Aquarius_Girl
当使用 sudo 时,您不能使用需要嵌入分号的命令。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接