我最近在服务器上安装了一个实用程序,发现从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>
并调用正确的内置函数。