我明白那个
sudo cd /directory
将返回:
sudo: cd: command not found
因为 cd 是 shell 内置命令,而不是二进制文件。但是,为什么
sudo echo 'this is a test'
工作正常?
这里究竟发生了什么?如果不是 shell,如何sudo
找到该命令?echo
答案1
原因很简单,cd
是一个 shell 内置函数(以及某些 shell 中的 shell 函数),而echo
它既是二进制文件又是 shell 内置函数:
$ type -a cd
cd is a shell builtin
$ type -a echo
echo is a shell builtin
echo is /bin/echo
sudo
无法处理 shell 内置命令,但可以处理$PATH
.当您使用sudo echo
,时,/bin/echo
在 中找到$PATH
,因此它使用该,同时在 中sudo cd
找不到,因此失败。cd
$PATH
答案2
跑步
which echo
给出
/bin/echo
echo
是一个普通的程序,并且sudo
可以“找到”它。
附带说明,必须有一些选项sudoers(5)
答案3
问题更多的是sudo cd
在操作系统上失败而不是sudo echo
成功。
sudo cd /directory
是一种非常合法的方法来检查给定用户(可能root
在这里)是否被允许cd
访问某个目录。这就是为什么所有 Posix 兼容操作系统做提供 的可执行版本cd
。
因此,您问题的答案是sudo echo yo
按设计工作的,因为echo
它是由 shell 别名和可执行命令提供的,但sudo cd /directory
不是因为您的操作系统(可能基于 Gnu/Linux)正在破坏Posix 标准在这个具体案例中。
对于您的系统来说,一个简单的解决方法是运行sudo sh -c "cd /directory"