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

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

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

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

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 можно использовать как AND, так и OR в одной строке?
  • Требуется ли «экспорт» при установке HISTIGNORE в файлах bashrc?
  • Сценарии Bash и большие файлы (ошибка): ввод с встроенным чтением из перенаправления дает неожиданный результат
  • Назначение '&& bash' в команде (не часть '&&', часть 'bash')
  • Что является хорошим примером сценария bash для изучения, чтобы изучить хорошие правила кодирования?
  • Захват файла журнала из нескольких сценариев
  • список всех файлов c в подкаталогах и их родительский каталог
  • извлечение параметра из нескольких выходных параметров в bash?
  • Interesting Posts

    Как получить btrfs для выделения места на новом устройстве?

    Отправить команду в оболочку через Makefile

    Можно ли назвать часть команды для повторного использования ее в той же самой команде позже?

    Как получить все четные строки и нечетные строки из файла и сохранить их в двух разных файлах, таких как Evenfile & Oddfile?

    ping не прекращается, когда iptables REJECT-s это

    Bash: понимание перенаправления ввода-вывода

    Есть ли что-то вроде lsblk для сетевых интерфейсов?

    aptitude unmarkauto пытается удалить пакеты

    Альтернатива ethtool на встроенной Linux-платформе MontaVista

    Openbox перезаписывает конфигурацию xmodmap

    Я хочу изменить корневые файлы, а также создавать файлы без root в одном сеансе текстового редактора.

    Почему этот скрипт запрашивает пароль?

    Самый используемый язык для Debian

    Существуют ли более передовые ACL-файлы для файловой системы за пределами традиционных «rwx» и POSIX ACL?

    Не обнаружено устройство Ethernet

    Linux и Unix - лучшая ОС в мире.