22

我想用 sudo 运行一个简单的 for 循环命令,但它不起作用:

sudo -i -u user for i in /dir; do echo $i; done

我收到以下错误:

-bash: syntax error near unexpected token `do'

我可能忽略了一件非常简单的事情。有什么帮助吗?

4

3 回答 3

33

sudo 想要一个程序(+arguments)作为参数,而不是一段 shell 脚本。不过,您可以这样做:

sudo -i -u user sh -c 'for i in /dir; do echo $i; done'

注意单引号。如果您使用双引号,您的 shell 将尝试扩展$i之前的 sudo(或者,更确切地说,由它运行的 shell)曾经看到它。

PS。正如评论中指出的(仅六年后),另一个问题是,如果您想遍历目录中的文件,正确的语法是for i in /dir/*. for接受一个列表,并且/dir是一个列表......只有一个项目。由于通配符扩展,扩展/dir/*为文件列表。/dir

于 2012-06-04T22:10:18.997 回答
6

你可以试试 sudo bash -c 'commands here'

于 2012-06-04T22:12:50.800 回答
2

将 sudo 放入循环中:

for i in /dir; do
    sudo -u user somecommand $i
done

例如,如果您需要其他用户的权限来为循环生成 glob,那么如果没有额外的步骤,这将无法工作。

于 2012-06-04T22:15:10.447 回答