Труба B в D? - A && B || C | D

Труба B в D? - A && B || C | D

Есть ли способ переписать структуру команды A && B || C | Dтак, чтобы либо B, либо C передавались в D?

При выполнении текущей команды выполняется либо только команда B, либо команда C и команда D.

Например:

введите описание изображения здесь

решение1

Да, в bash можно использовать скобки:

(A && B || C) | D

Таким образом, вывод A && B || Cбудет передан в D.

решение2

Вы можете написать это как

if A; then B; else C; fi | D

Вы говорите, что хотите запустить либо Bили C, но A && B || Cне достигает этого. Если Aуспешно, но Bзапускается и терпит неудачу, то будет выполнено C.

Примечание 1: если вы можете каким-то образом гарантировать, что это Bвсегда сработает, и хотите придерживаться короткой версии, то я бы все равно выбрал

{ A && B || C; } | D

более ( ... ), так как последнее приводит к ненужному созданию новой подоболочки, которая может быть оптимизирована или нет.

Примечание 2: обе формы Aне производят вывода, что верно в вашем примере, но не обязательно так в общем случае. Этого можно избежать,

A; if [ "$?" -eq 0 ]; then B; else C; fi | D

решение3

Ответ акцептора правильный, но он не охватывает потенциальный вариант использованиянетиметь выход Aв качестве входа D. Чтобы добиться этого, вам понадобится перенаправление потока в Aзависимости от ваших потребностей.

  • Если вы все равно хотите отменить вывод A:

    { A >/dev/null && B || C; } | D
    
  • Если вы хотите увидеть вывод Aна терминале:

    { A >/dev/tty && B || C; } | D
    
  • Если вам нужны выходные данные Aв качестве входных данных для последующей команды, Eвам понадобится дополнительная группа команд и перенаправление потока:

    { { A >&3 && B || C; } | D; } 3>&1 | E
    

Если все это кажется вам слишком заумным (как и мне), я рекомендую вам использовать специальную переменную оболочки для статуса выхода Aи работать с ней:

A
if [ $? -eq 0 ]; then
  B
else
  C
fi |
D

Если вы хотите быть более кратким, но не слишком заумным, я предлагаю следующее:

A; { [ $? -eq 0 ] && B || C; } | D

(См. также последнюю частьответ hvd(Чего я не заметил, когда писал свой первоначальный ответ.)

Связанный контент