所以,在 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)
为什么?
您需要将其作为命令提供给bashas()解释bash为在子shell中运行括号内的命令:
sudo bash -c '(cd /some/dir; ./runscript.sh)'
Run Code Online (Sandbox Code Playgroud)
在较低级别,sudo不是在 bash(或其他 shell)中运行命令,而是实际根据您传递的“命令”启动一个新进程,并使用您传递的其余参数启动该进程。
正如@heemayl 指出的那样,您可以使用语法sudo bash -c '(cd /some/dir; ./runscript.sh)'. 这是因为bash是合法的系统可执行文件。sudo无法创建名为(cdas的进程,这(是 bash 语法的一部分,通常不是有效的可执行文件名称。