Estou tentando escrever todos os meus sh
scripts de inicialização / env para trabalhar com o máximo de DRY e o máximo: "funciona em todos os * nix que clono", quanto possível. Isso significa garantir que, se eu tentar executar o código que não existe, o código falhe normalmente. Para esse fim, preciso ser capaz de testar se existem programas. Sei como testar se existe um arquivo, mas não sei como testar para ver se um aplicativo é executável no caminho. Prefiro usar o $ PATH, pois alguns deles precisam trabalhar em arch, ubuntu e centos. Alguns podem estar instalados no meu homedir, em sistemas nos quais não tenho root, outros podem não estar instalados e outros ainda podem estar instalados nos caminhos do sistema.
shell
shell-script
posix
xenoterracida
fonte
fonte
Respostas:
Use
type commandname
. Isso retorna true secommandname
houver algo executável: alias, função, comando interno ou externo (consultado$PATH
). Como alternativa, use ocommand commandname
que retorna true secommandname
for um comando interno ou externo (consultado$PATH
).Existem algumas variantes sh (definitivamente pré-POSIX; eu conheço o
/bin/sh
OSF1 ≤3.xe algumas versões do shell Almquist encontradas nas versões iniciais do NetBSD e algumas distribuições Linux do século XX), ondetype
sempre retorna 0 ou não existir. Eu não acho que nenhum sistema enviado com estes neste milênio. Se você os encontrar, aqui está uma função que você pode usar para pesquisar$PATH
manualmente:Essa função geralmente é útil se você deseja excluir funções e recursos internos e procurar o nome
$PATH
. A maioria dos shells possui um built-in para isso,command -v
embora seja uma adição relativamente recente ao POSIX (ainda opcional a partir do POSIX: 2004). É basicamente uma versão amigável do programadortype
: imprime o caminho completo de um executável$PATH
, o nome simples de um built-in ou função e uma definição de alias para um alias.Ksh, bash e zsh também precisam
type -p
procurar apenas executáveis no$PATH
. Observe que, no bash, o status de retornotype -p foo
é 0 sefoo
for uma função ou função interna; se você quiser testar um executável$PATH
, precisará verificar se a saída não está vazia.type -p
não está no POSIX; por exemplo, o ash do Debian (que está/bin/sh
no Ubuntu) não o possui.fonte
if [ type keychain ]; then
não funciona? Recebo erro/home/xenoterracide/.zshrc:84: parse error: condition expected: type
Acho que eu poderia escrever a função existe ... Eu apenas pensei que isso poderia ser mais simples em um sentido ...if type $APP >/dev/null 2>/dev/null; then ...
Você não quer o[]
.type -p
se você estiver procurando especificamente por um comando$PATH
(não aliases, funções ou componentes internos).Se você estiver procurando apenas programas externos, também poderá usar quais. Não sei como isso é portátil.
fonte
type
oucommand
;which
não está no POSIX, por exemplo. Na prática,which
existe quase em toda parte, mas em alguns lugares (onde é implementado como um script csh), ele usa um caminho diferente (devido a.cshrc
), que derrota o objetivo.