我想知道如何检查命令是否已安装。
具体来说,我想vi
在所有有效命令的vim
机器上使用别名。vim
我想让我的 *rc 文件保持通用。但有些操作系统默认情况下并未vim
安装。而在其他方面,vi
是Vi 已改进,但vim
不是有效命令。
我想我可以这样做(bash风格):
#If the version info from vi includes the phrase "Vi IMproved", then vi IS vim.
vimInfo=$(vi --version 2> /dev/null | head -n 1 | grep -Fi 'VI IMPROVED')
if [[ -z $vimInfo ]]; then
if [[ -f $(which vim) ]]; then
#if the value returned by 'which' is a valid directory, then vim is installed
alias vi='vim'
else
#vim is not installed
echo "Vi IMproved (vim) is not installed";
fi
fi
但还有更好的办法吗?该which
命令是否保证出现在所有类 UNIX 机器上?
PS 我有几乎所有流行 shell(bash、tcsh、zsh、ksh)的 *rc 文件,我打算在所有这些 shell 中应用该解决方案。因此,解决方案不应该是特定于 shell 的。语法能不过,是的。
答案1
您可以使用command
例如:
command -v vim
它是一个 shell 内置命令。 (zsh、bash、ksh、但不是tcsh)
在tcsh你可以使用这个:
~> sh -c 'command -v vim'
答案2
我认为你把这个问题过于复杂化了。
if type vim >/dev/null 2>/dev/null; then
alias vi=vim
fi
vim
运行and 的唯一原因vi
是,如果系统中这些命令是有效的,但安装不知何故被破坏,或者存在另一个同名的程序。
该type
内置函数存在于所有 POSIX shell 和大多数 Bourne shell 中。在 csh 中(和仅在 csh 中), 使用which
:
if ({ which vim }) alias vi vim >&/dev/null
在鱼中:
if type vim >/dev/null 2>/dev/null; alias vi=vim; end