Coloque dois comandos depois de um ||

4

Gostaria de verificar se há alguns comandos disponíveis. Se não estiver, gostaria de imprimir uma mensagem de erro e sair.

Gostaria de fazer isso sem verificar variáveis, porque é um pequeno ponto no script e não quero que ele se espalhe por várias linhas.

A forma que eu gostaria de usar é basicamente esta:

rsync --help >> /dev/null 2>&1 || printf "%s\n" "rsync not found, exiting."; exit 1

Infelizmente, o exit 1 é executado independentemente do resultado do rsync.

Existe uma maneira de usar essa mensagem do tipo perl no bash, ou não?

    
por JoshuaD 14.11.2016 / 16:59

3 respostas

13

Para responder diretamente à pergunta, os grupos agrupam os comandos, portanto:

rsync --help >> /dev/null 2>&1 || { printf "%s\n" "rsync not found, exiting."; exit 1; }

Como uma sugestão para fazer o que você quer, mas de outra forma:

#!/usr/bin/env bash
for c in rsync ls doesnotexist othercommand grep
do
  if ! type "$c" &> /dev/null
  then 
    printf "$c not found, exiting\n"
    exit 1
  fi
done

E se você quiser emular o die do perl no shell:

function die {
  printf "%s\n" "$@" >&2
  exit 1
}

# ...
if ! type "$c" &> /dev/null
then
  die "$c not found, exiting"
fi
# ...
    
por 14.11.2016 / 17:05
5

Precisa ser um one-liner? Eu não sou um grande fã de curto-circuito. Eu escreveria assim:

if ! rsync --help &>/dev/null; then
    printf "%s\n" "rsync not found, exiting."
    exit 1
fi
    
por 14.11.2016 / 17:03
1

A maneira mais simples (como você pode querer fazer a mesma coisa em vários lugares) é definir uma função:

die()
{
    echo "$@" >2
    logger -t "$0" -- "$*"
    exit 1;
}

Observe que die envia sua mensagem de erro ao erro padrão - você desejará isso no caso geral. Eu também envio uma mensagem para o syslog (o script do qual eu fiz isso é de longa duração), mas você não precisa fazer isso se não quiser.

Você pode usar isso simplesmente:

rsync -q --help 2>&- || die "rsync not found, exiting."

Eu também usei rsync -q para suprimir a saída de ajuda no caso de sucesso. De fato, você pode achar que está feliz com o comportamento de

set -e
rsync -q --help

que, se não houver rsync on $PATH , informará

$0: rsync: command not found

(com o seu nome de script no lugar de $0 ) e saia com o status 127.

    
por 15.11.2016 / 12:09

Tags