Поместите две команды после ||

Я хотел бы проверить, чтобы было доступно несколько команд. Если это не так, я бы хотел напечатать сообщение об ошибке, а затем выйти.

Я хотел бы сделать это, не проверяя переменные, потому что это небольшая точка в скрипте, и я не хочу, чтобы он разрастался над кучей строк.

Форма, которую я хотел бы использовать, в основном такова:

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

К сожалению, exit 1 выполняется независимо от результата rsync.

Есть ли способ использовать это сообщение типа perl-типа в bash или нет?

3 Solutions collect form web for “Поместите две команды после ||”

Чтобы непосредственно ответить на вопрос, команды группы фигурных скобок вместе, так:

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

Как предложение делать то, что вы хотите, но по-другому:

 #!/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 

И если вы хотите эмулировать die perl в оболочке:

 function die { printf "%s\n" "$@" >&2 exit 1 } # ... if ! type "$c" &> /dev/null then die "$c not found, exiting" fi # ... 

Нужно ли быть однострочным? Я не большой поклонник короткого замыкания. Я бы написал так:

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

Самый простой способ (так как вы можете сделать то же самое в нескольких местах) – это определить функцию:

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

Обратите внимание, что die отправляет свое сообщение об ошибке в стандартную ошибку – вы захотите этого в общем случае. Я также отправляю сообщение в syslog (сценарий, который я использовал, это долго работает), но вам не нужно это делать, если вы этого не хотите.

Вы можете использовать это просто:

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

Я также использовал rsync -q для подавления вывода справки в случае успеха. Фактически, вы можете обнаружить, что вы довольны поведением

 set -e rsync -q --help 

который, если нет rsync на $PATH , сообщит

$0 : команда rsync: команда не найдена

(с именем вашего скрипта вместо $0 ) и выйти со статусом 127.

  • Пример для $ "..."
  • Bash добавить конечные пробелы, чтобы оправдать строку
  • @ и * в петле bash
  • Не можете использовать! $ В скрипте?
  • Перемещение файлов точек с использованием bash и создание символических ссылок
  • Сепаратор между списком команд и}
  • Как восстановить предыдущую историю и предыдущую историю в Bash?
  • Перезапустите процесс, когда я получу stderr из другого процесса
  • Как загрузить .bashrc из "bash -c"
  • Оператор Bash OR не оценивает несколько переменных
  • Выполнить файл в приложении на основе расширения файла в bash
  • использовать she-bang in oneliner
  • Linux и Unix - лучшая ОС в мире.