在bash 4.1.2
,Centos 6.10
上(因为我们是怪物)。
sudo command vim
返回
sudo: command: command not found
我不明白为什么。在bash 4.4.23
,Mac OS High Sierra
上可以正常工作。用谷歌搜索非常困难,因为人们使用“命令”作为他们正在谈论的各种命令的占位符。
我有一个名为vim
的函数(如下所示),将command
从对vim的调用中删除了不是导致失败,就像我想要的那样在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更改日志,我可以了解一下直到bash 4.1之后才实施了“命令”?
答案 0 :(得分:2)
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
作为内置外壳的操作系统可能就足够了。 (POSIX规范指出“该命令实用程序很可能是作为常规内置程序提供的。”,并继续列出了为什么在其他必须< / em>是内置的。)