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

Ваша конфигурация должна в основном работать, но я хотел бы сделать несколько предложений:

Во-первых, я думаю, вы хотите использовать ATTR , а не ATTRS . ATTRS выполняет поиск во всем дереве устройств вверх до соответствующего (родительского) устройства. Скорее всего, это не то, что вы намеревались сделать. При использовании ATTR устройство, фактически инициирующее событие, должно иметь указанный атрибут.

Во-вторых, поскольку создание символических ссылок на узлы устройств является довольно распространенной задачей, для этого есть специальный оператор, то есть SYMLINK + = "newname" . Таким образом, вы не будете зависеть от «внешних» команд. Что еще более важно, с помощью этой директивы вам нужно сопоставить только событие «add», поскольку udevd автоматически удаляет связанные символические ссылки, когда устройство исчезает.

Таким образом, ваши правила должны быть

ACTION=="add", ATTR{idVendor}=="0123", ATTR{idProduct}=="0001", SYMLINK+="ttyController"
ACTION=="add", ATTR{idVendor}=="3210", ATTR{idProduct}=="0002", SYMLINK+="ttyPosition"

И, наконец, я бы предложил сузить соответствие, добавив дополнительное ограничение SUBSYSTEM, то есть добавив SUBSYSTEM == "usb" . Поскольку идентификаторы устройства и поставщика уникальны (будем надеяться) только в своей области, исключение совпадения подсистем может привести к совпадению правил для других классов устройств, таких как устройства PCI. Хотя это маловероятно, в правилах udev это обычно считается хорошим стилем:

SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="0123", ATTR{idProduct}=="0001", SYMLINK+="ttyController"
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="3210", ATTR{idProduct}=="0002", SYMLINK+="ttyPosition"
5
15.11.2016, 06:31
3 ответа

Это должно быть однострочное письмо? Я не большой поклонник коротких замыканий. Я бы написал это так:

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

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

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

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

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

# ...
if ! type "$c" &> /dev/null
then
  die "$c not found, exiting"
fi
# ...
13
27.01.2020, 20:31

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

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

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

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

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

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

set -e
rsync -q --help

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

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

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

1
27.01.2020, 20:31

Теги

Похожие вопросы