使用sudo和for循环

23

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

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

我收到以下错误:

-bash: syntax error near unexpected token `do'

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

3个回答

36

sudo需要一个程序(+参数)作为参数,而不是一段Shell脚本。你可以这样做:

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

注意使用单引号。如果您使用双引号,您的shell将在sudo(或者更准确地说,由其运行的shell)看到$i之前就会尝试展开它。

PS. 如评论中指出的一个单独问题(六年后),如果想要迭代目录中的文件,则正确的语法是for i in /dir/*for接受列表,而/dir是一个列表...有一个元素。/dir/*由于通配符扩展而扩展为/dir中的文件列表。


你做到了!祝大家好运。 - shellter
根据这个,每个输出文件都将被写入/保存在指定用户的主目录中。如果我想要将输出写入特定的目录,该怎么办? - Alessandro Cuttin
@AlessandroCuttin 这个例子没有写任何输出文件。看起来你的评论是关于问题的一个未指定的变化...? - Jan Krüger
1
使用反引号: sudo -i -u root sh -c 'for i in /dir; do echo $i; done' 会返回:sh: /dir: 是一个目录 使用单引号则不会返回任何内容... (Redhat) - user1767316
@user1767316 我简直不敢相信之前没有人注意到这个问题。我已经在帖子中添加了一条注释。感谢您指出这一点的评论! - Jan Krüger
显示剩余5条评论

7
您可以尝试使用sudo bash -c '在此处输入命令'。

2
将sudo放到循环内部:
for i in /dir; do
    sudo -u user somecommand $i
done

如果您需要其他用户的权限来生成循环的 glob,则需要额外的步骤才能使其正常工作。


5
问题在于,如果sudo的超时时间不够长,它会一直要求输入密码 :( - Lilás
我认为这个答案不完整,如果你想要访问/读取“dir”中的文件,你需要先使用sudo,所以我会投反对票...抱歉! - jcoder8

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