Есть ли способ переписать структуру команд A && B || C | D
так, чтобы B или C передавались по D?
С текущей командой запускаются только B или C и D.
Например:
Да, в bash вы можете использовать круглые скобки:
(A && B || C) | D
Таким образом, вывод A && B || C
будет передан в D
.
A && (B || C) | D
, если вы не хотите, чтобы B, C или D запускались при сбое Ash
:)A
находится внутри подоболочки, это также включает в себяA
.)Вы можете написать это как
Вы говорите, что хотите бежать
B
илиC
, ноA && B || C
не достигаете этого. ЕслиA
успешно, ноB
работает и не удается, он будет выполненC
.Примечание 1: если вы можете каким-то образом гарантировать, что
B
всегда добьетесь успеха и захотите использовать короткую версию, тогда я все же выберуболее того
( ... )
, так как последний излишне заставляет создавать новую подоболочку, которая может или не может быть оптимизирована.Примечание 2: обе формы предполагают, что не
A
производит вывод, что верно в вашем примере, но не обязательно так в общем. Этого можно избежатьисточник
{ … }
не создаст подоболочку из-за трубы? Я наблюдаю следующее поведение:pgrep bash
и,pgrep bash | cat
иif true; then pgrep bash; fi
и{ pgrep bash; }
есть одна строка вывода;( pgrep bash; )
и( pgrep bash; ) | cat
и{ pgrep bash; } | cat
иif true; then pgrep bash; fi | cat
имеют две строки вывода.... | ...
вызывает создание подоболочки, это неизбежно.( ... )
По крайней мере теоретически, это приводит к созданию дополнительной подоболочки, которая{ ...; }
избегает, но это то, что я имел в виду, «может или не может быть оптимизировано»: возможно, что в данном конкретном случае оболочка понимает, что это не имеет значения, эффект был бы таким же.Ответ акцептора верен, но он не охватывает потенциальный вариант использования, чтобы не выводить в
A
качестве входных данныхD
. Для этого вам понадобится перенаправление потока вA
зависимости от ваших потребностей.Если вы хотите отказаться от вывода в
A
любом случае:Если вы хотите увидеть вывод
A
на терминале:Если вам нужен вывод в
A
качестве ввода последующей команды,E
вам понадобится дополнительная группа команд и перенаправление потока:Если все это выглядит слишком загадочно для вас (как и для меня), я рекомендую вам использовать специальную переменную оболочки для статуса выхода
A
и работать с этим:Если вы хотите быть более кратким, но не слишком загадочным, я предлагаю следующее:
(См. Также последнюю часть ответа hvd, которую я не заметил, когда писал свой оригинальный ответ.)
источник
A
вышел из конвейера.