it-swarm-pt.tech

Como faço para testar se existe um aplicativo em $ PATH?

Estou tentando escrever todos os meus scripts sh startup/env para trabalhar com tanto DRY e tanto: "funciona em todos * nix eu clonei para ", se possível. Isso significa ter certeza de que, se eu tentar executar um código que não está lá, o código falhará normalmente. Para isso, preciso ser capaz de testar se existem programas. Eu sei como testar se um arquivo existe, mas não tenho certeza de como testar para ver se um aplicativo é executável no caminho. Eu prefiro usar o $ PATH, já que alguns deles precisam funcionar no Arch, ubuntu e centos. Alguns podem estar instalados em meu homedir, em sistemas onde não tenho root, outros podem não estar instalados e outros ainda podem ser instalados em caminhos de sistema.

19
xenoterracide

Use type commandname . Isso retorna verdadeiro se commandname for qualquer coisa executável: alias, função, comando interno ou externo (pesquisado em $PATH). Como alternativa, use command commandname que retorna verdadeiro se commandname for um comando interno ou externo (pesquisado em $PATH).

exists () {
  type "$1" >/dev/null 2>/dev/null
}

Existem algumas variantes sh (definitivamente pré-POSIX; eu conheço /bin/sh sob OSF1 ≤3.x e algumas versões do Almquist Shell encontradas nas primeiras versões do NetBSD e algumas distribuições de Linux do século 20) onde type sempre retorna 0 ou não existe. Eu não acho que nenhum sistema foi lançado com isso neste milênio. Se você os encontrar, aqui está uma função que você pode usar para pesquisar em $PATH manualmente:

exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }

Esta função é geralmente útil se você deseja excluir integradas e funções e procurar o nome em $PATH. A maioria dos shells tem um embutido para isso, command -v , embora seja uma adição relativamente recente ao POSIX (ainda opcional em POSIX: 2004). É basicamente uma versão amigável do programador de type: ele imprime o caminho completo para um executável em $PATH, o nome simples de uma função ou interna e uma definição de alias para um alias.

exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}

Ksh, bash e zsh também têm type -p para procurar apenas executáveis ​​em $PATH. Observe que em bash, o status de retorno de type -p foo é 0 se foo for uma função ou embutido; se você deseja testar um executável em $PATH, você precisa verificar se a saída não está vazia. type -p não está em POSIX; por exemplo, o ash do Debian (que é /bin/sh no Ubuntu) não tem.

19

Se você está procurando apenas programas externos, também pode usá-los. Não sei como isso é portátil.

1
Kim