尽管 echo 是 shell 内置函数,为什么“$ sudo echo 'yo'”仍然有效?

尽管 echo 是 shell 内置函数,为什么“$ sudo echo 'yo'”仍然有效?

我明白那个

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"

相关内容