Передача нескольких команд в одну команду

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

Пример 1: объединить и отсортировать выходные данные всех трех команд echo:

echo zzz; echo aaa; echo kkk

желаемый результат:

aaa
kkk
zzz

Пример 2: перепишите следующее, чтобы все команды находились в одной командной строке с использованием каналов без перенаправлений во временный файл:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo

3 ответа

Решение

Используйте скобки (), чтобы объединить команды в один процесс, который объединит стандартный вывод каждого из них.

Пример 1 (обратите внимание, что $ это приглашение оболочки):

$ (echo zzz; echo aaa; echo kkk) | sort
aaa
kkk
zzz


Пример 2:

(setopt; unsetopt; set) | sort

Ты можешь использовать {} для этого и устранить необходимость в под-оболочке, как в (list), вот так:

{ echo zzz; echo aaa; echo kkk; } | sort

Нам нужен пробельный символ после { и раньше }, Нам также нужно последнее ; когда последовательность написана в одной строке.

Мы могли бы также написать его в несколько строк без необходимости какого-либо ;:

Пример 1:

{
  echo zzz
  echo aaa
  echo kkk
} | sort

Пример 2:

{
  setopt
  unsetopt
  set
} | sort

В Windows это будет выглядеть следующим образом: (echo zzz & echo aaa & echo kkk) | sort

Или, если он находится внутри командного файла, он может быть как однострочным (как образец), так и многострочным:

(
 echo zzz
 echo aaa
 echo kkk
) | sort

Примечание: в оригинальном посте не упоминается, что это только для Linux, поэтому я добавил решение для командной строки Windows... это очень полезно при работе с VHD/VHDX с diskpart внутри скриптов (echo diskpart_command) вместо эха на том же, но пусть там echoЕсть и другой способ без эха и с > перенаправитель, но он очень склонен к ошибкам и гораздо более сложен для записи (зачем использовать сложный способ подвержен ошибкам, если существует простой способ, который всегда работает хорошо)... также помните %d% дает вам фактический путь (очень полезно для не жесткого кодирования пути к файлам VHD/VHDX).

Другие вопросы по тегам