comando -v saída personalizada

2

Atualmente tenho o comando:

command -v gpg 2>/dev/null || { echo "Cound not find gpg. Aborting."; }

Eu gostaria que, em vez de redirecionar a saída para / dev / null, gostaria de exibir uma mensagem informando a saída do comando e depois found! .

Ou seja.

  • Se o gpg não for encontrado: Cound not find gpg. Aborting.
  • Se o gpg for encontrado: gpg found at /usr/local/bin/gpg
por Karl Morrison 21.07.2017 / 09:57

3 respostas

5

A abordagem mais simples seria algo assim:

command -v gpg &>/dev/null && 
    echo "gpg found at  $(command -v gpg)" || 
    echo "Cound not find gpg. Aborting."

Claro que isso não é muito elegante, já que precisa executar command duas vezes. Uma alternativa seria:

gpg=$(command -v gpg 2>/dev/null) && 
    echo "gpg found at $gpg." ||
    echo "Cound not find gpg. Aborting."
    
por terdon 21.07.2017 / 10:04
2

Isso faria o truque:

command -v gpg &>/dev/null && echo "gpg has been found at $(which gpg)" || 
{ echo "Cound not find gpg. Aborting."; }
    
por Ravexina 21.07.2017 / 10:04
1

Embora a solução aceita por terdon ♦ seja breve e bonita, gostaria de sugerir algo como:

cmd_exists() {
  (
    unalias "" 2>/dev/null
    status=$(command -v "")
    case $status in
      *"") echo " found at $status";;
      "") echo "Could not find . Aborting."; return 127;;
      *) echo "Error: $status" >&2; return 1;;
    esac
  )
}

cmd_exists gpg

Ele lida com dois casos não tratados pelo outro método aqui:

  1. Aliases: eles podem ocultar um executável, mas minha função fornece o caminho real para o executável somente se houver um. Os outros métodos fornecerão a definição de alias e retornarão um código de saída zero, independentemente de existir ou não um comando real.

  2. Melhor tratamento de erros: O código de saída 127 representa o tipo de erros "Comando não encontrado", portanto você pode ter um tratamento de erros separado para quando um comando não for encontrado e quando algum outro erro ocorrer.

    Se houver algum erro imponderável (ou seja, um erro desconhecido, exceto se o comando não for encontrado), ele não o ocultará, levando você a pensar que gpg não existe quando isso ocorrer. Se você quiser descartar esses erros, chame assim:

    cmd_exists gpg 2>/dev/null

Notas:

Com relação aos aliases, isso pode ou não ser o que você deseja, por exemplo, Saber que um alias existe pode ser o suficiente para você.

Unalias acontece dentro de um subshell, então não atrapalha os aliases do seu shell de trabalho.

Em relação ao tratamento de erros, não sou especialista em scripts de shell, portanto, não saberia qual seria a probabilidade de erro nessa situação nem se há uma maneira melhor de lidar com eles.

Então, cuidado, isso pode ser um exagero.

    
por Samuel Santana 21.07.2017 / 20:01