如何判断 $PATH 上的 sudo 命令是否可用?

如何判断 $PATH 上的 sudo 命令是否可用?

我最近在服务器上安装了一个实用程序,发现从sudo.也就是说,foo按预期执行购买sudo foo导致sudo: foo: command not found

我将此追溯到使用仅具有 .sudo链接的命令/usr/local/bin和 sudo 。我修改了安装脚本来安装,一切都很顺利。PATH/usr/bin/usr/bin

我想更改我的服务器设置脚本来检测这种情况,并在将来发生某些变化且该命令因任何原因不可用时报告错误。我正在从这个工作StackOverflow问题及其建议使用这样的测试的答案:

command -v foo >/dev/null 2>&1 || { echo "I require foo but it's not installed.  Aborting." >&2; exit 1; }

然而,这并不像预期的那样sudo

$ command -v foo
/usr/bin/foo
$ sudo command -v foo
sudo: command: command not found
$ sudo type foo
sudo: type: command not found
$ sudo hash -v foo
sudo: hash: command not found
$ sudo foo
   ...executes normally...
$ sudo bash
# command -v foo
/usr/bin/foo
# sudo command -v foo
sudo: command: command not found
# foo
   ...executes normally...
# sudo foo
   ...executes normally...

奇怪地sudo which foo发现命令在/usr/bin/;当我运行时sudo which bar,它告诉我,这意味着启动子命令时which: no foo in (/sbin:/bin:/usr/sbin:/usr/bin)sudo 的路径确实包含。/usr/bin

到底是怎么回事?
我可以运行什么测试来确定命令是否可用于调用sudo 没有调用命令? (另外,在不调用 的情况which下,正如链接问题中的一些评论和答案所警告的那样;否则我对此没有意见......)

答案1

sudo用于执行二进制文件,因此除非执行 shell,否则 shell 内置命令不可用。bash -c告诉 bash 解释下一个参数,因此sudo bash -c "command -V <exe>"告诉sudo执行bash它解释字符串command -V <exe>并调用正确的内置函数。

相关内容