所以,在 bash 中,这工作得很好:
(cd /some/dir; ./runscript.sh)
假设 /some/dir/runscript.sh 存在。
但
sudo (cd /some/dir; ./runscript.sh)
失败并出现错误:
-bash: syntax error near unexpected token `cd'
为什么?
答案1
您需要将其作为命令提供给bash
as()
来解释,以便bash
在子 shell 中运行括号内的命令:
sudo bash -c '(cd /some/dir; ./runscript.sh)'
答案2
在较低级别,sudo
不是在 bash(或其他 shell)中运行命令,而是实际上根据您传递的“命令”启动一个新进程,并使用您传递的其余参数启动该进程。
正如@heemayl 指出的,您可以使用语法sudo bash -c '(cd /some/dir; ./runscript.sh)'
.这是因为bash
它是合法的系统可执行文件。sudo
无法创建名为 bash 语法一部分的进程(cd
,(
并且通常不是有效的可执行文件名称。