sudo (cd /some/dir; ./runscript.sh) 失败

ada*_*dev 6 bash sudo

所以,在 bash 中,这很好用:

(cd /some/dir; ./runscript.sh)

假设 /some/dir/runscript.sh 存在。

sudo (cd /some/dir; ./runscript.sh)
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

-bash: syntax error near unexpected token `cd'
Run Code Online (Sandbox Code Playgroud)

为什么?

hee*_*ayl 9

您需要将其作为命令提供给bashas()解释bash为在子shell中运行括号内的命令:

sudo bash -c '(cd /some/dir; ./runscript.sh)'
Run Code Online (Sandbox Code Playgroud)

  • 我知道这种语法,但仍然觉得这个问题很有趣。所以,`(` 是`bash` 语法的一部分,而不是`sudo` 可以接收的命令——这是确切的问题吗? (3认同)
  • @通配符完全.. (2认同)

Jas*_*ush 6

在较低级别,sudo不是在 bash(或其他 shell)中运行命令,而是实际根据您传递的“命令”启动一个新进程,并使用您传递的其余参数启动该进程。

正如@heemayl 指出的那样,您可以使用语法sudo bash -c '(cd /some/dir; ./runscript.sh)'. 这是因为bash是合法的系统可执行文件。sudo无法创建名为(cdas的进程,这(是 bash 语法的一部分,通常不是有效的可执行文件名称。

  • 当然,在`sh -c` 中使用括号是没有意义的,因为它在子进程中给了你一个没有明显原因的子shell。 (3认同)