Вызов нескольких команд в одну команду
Как я могу передать stdout из нескольких команд в одну команду?
Пример 1: объединение и сортировка вывода всех трех команд эха:
echo zzz; echo aaa; echo kkk
желаемый результат:
aaa
kkk
zzz
Пример 2: перепишите следующее, чтобы все команды находились в одной командной строке, используя каналы, без перенаправления на временный файл:
setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo
Ответы
Ответ 1
Используйте круглые скобки(), чтобы объединить команды в один процесс, который объединит stdout каждого из них.
Пример 1 (обратите внимание, что $
- приглашение оболочки):
$ (echo zzz; echo aaa; echo kkk) | sort
aaa
kkk
zzz
Пример 2:
(setopt; unsetopt; set) | sort
Ответ 2
Вы можете использовать {}
для этого и исключить необходимость в под-оболочке, как в (list)
, например:
{ echo zzz; echo aaa; echo kkk; } | sort
Нам нужен символ пробела после {
и до }
. Мы также нуждаемся в последнем ;
, когда последовательность записывается на одной строке.
Мы могли бы также записать его на несколько строк без необходимости в любом ;
:
Пример 1:
{
echo zzz
echo aaa
echo kkk
} | sort
Пример 2:
{
setopt
unsetopt
set
} | sort
Ответ 3
В 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).