在bash 4.1.2
,Centos 6.10
(因为我们是怪物)。
sudo command vim
回报
sudo: command: command not found
我不明白为什么。在bash 4.4.23
,Mac OS High Sierra
它按预期工作。由于人们使用“命令”作为他们正在谈论的各种命令的占位符,所以谷歌很难。
我有一个名为vim
的函数(见下文),从调用vim中取出command
不会导致它失败,就像我期望的那样,在bash 4.4和4.1中。
如果我无法写入文件,我有一个自动sudo vim的功能:
vim() {
#only good for auto-sudo. delete if no sudo privileges.
if [[ "$#" -ne 1 ]]; then
command vim "$@"
#cases: if we can write to the file, or the file doesn't exist but we can make new files in that dir
elif [[ -w "$1" || ( -w $(dirname "$1") && ! -f "$1" ) ]]; then
# \vim or 'vim' only escape aliases, not functions
command vim "$1"
else
#this 'command' isn't required! It won't loop forever without it.
sudo env HOME="$HOME" command vim -u $HOME/.vim/vimrc "$1"
fi
}
我希望命令是必需的,否则vim
应该参考我所做的功能,并无限地称之为无限。但是,不仅在CentOS和Mac系统上都不需要它,而且它还会导致CentOS盒上的功能失败!
谁能解释这种行为?
有没有一个方便的bash changelog我可以看看知道“命令”是否在bash 4.1之后才实现?
sudo
期待一个可执行文件; command
(通常)是一个内置的shell,而不是一个可执行文件,它修改了shell执行查找的方式。 sudo vim
可以正常工作,因为sudo
无法运行shell函数或使用名为vim
的别名来影响command vim
会给你的可执行文件。
macOS
实际上确实提供了一个shell脚本/usr/bin/command
(据我所知)似乎模拟了内置的shell,同时补偿了HFS +默认的大小写不敏感。内置的command
将在bash
中隐藏它,但它可以从其他shell(或运行其他命令的命令,如sudo
)中获得。
POSIX要求实现command
,但不一定是内置的shell。提供带有command
作为内置的shell可能足够用于操作系统。 (POSIX规范声明“命令实用程序最有可能作为常规内置提供。”,并列出了为什么command
没有列在必须内置的其他命令中的一些原因。)