Você pode usar command
, por exemplo:
command -v vim
É um comando interno do shell. (zsh, bash, ksh, mas não tcsh)
Em tcsh você pode usar isto:
~> sh -c 'command -v vim'
Eu quero saber como verificar se um comando está instalado.
Especificamente, desejo alias vi
to vim
em todas as máquinas em que vim
é um comando válido. E eu quero manter meus arquivos * rc genéricos. Mas alguns sistemas operacionais não vêm com vim
instalado por padrão. E em outros, vi
é Vi o IMproved, mas vim
não é um comando válido.
Eu imaginei que poderia fazer isso (estilo 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
Mas existe uma maneira melhor? E o comando which
está garantido para estar presente em todas as máquinas tipo unix?
P.S. Eu tenho arquivos * rc para quase todos os shell populares (bash, tcsh, zsh, ksh) e pretendo aplicar a solução em todos eles. Portanto, a solução não deve ser específica do shell. A sintaxe pode , no entanto.
Acho que você está complicando demais isso.
if type vim >/dev/null 2>/dev/null; then
alias vi=vim
fi
A única razão para executar vim
e vi
é se existem sistemas onde estes são comandos válidos, mas a instalação está de alguma forma quebrada ou existe outro programa com esse nome.
O type
embutido existe em todos os shells POSIX e na maioria dos shells Bourne. Em csh (e apenas em csh ), use which
:
if ({ which vim }) alias vi vim >&/dev/null
Em peixes:
if type vim >/dev/null 2>/dev/null; alias vi=vim; end
Tags command shell-script rc