На момент написания этой статьи синтаксис принятого ответа был неправильным для большинства, если не для всех оболочек, производных от Борна, в том числе bash
. Я предложил правку сверху и принял ответ, чтобы исправить это, но я также был склонен добавить всю эту другую информацию, и это было бы скорее переписать, чем редактировать.
Вы можете использовать составные команды:
{ grep ...; bzgrep ...; } >file
..или подоболочки (обратите внимание на круглые скобки вместо фигурных скобок):
(grep ...; bzgrep ...) >file
..группировать команды. Способ subshell имеет более приятный синтаксис (более простое отсутствие пробелов и позволяет пропустить последнюю точку с запятой), но он либо разветвляет новый процесс, либо «делает вид», выполняя команды в очищенной среде. Оба имеют свои преимущества в зависимости от того, что вы хотите сделать, которые здесь не имеют значения, но их стоит посмотреть, если вы хотите больше владеть оболочкой.
Примечание. С этими приемами вы также можете использовать конвейерную обработку, так что вы можете сделать что-то вроде этого:
{ grep ...; bzgrep ...; } | less
PS если вы не заботитесь о упорядочении матчей в вашей совокупной продукции, вы можете использовать один &
между двумя командами, например , так: { grep ... & bzgrep ...; }
. Затем две команды выполняются одновременно: grep
запускается и оболочка помещает его в фоновый режим, затем оболочка запускает bzgrep
. (Но с этим есть небольшая оговорка: объяснение, включающее перенаправление файлов и буферизацию файлового потока, потенциально может привести к разделению / искажению очень маленькой части строк в выходном файле: увидите ли вы, что это будет зависеть от того grep
, как вы , bzgrep
и libc
stdio.h
функции реализованы. В большинстве реализаций я полагаю, что передача команды перед перенаправлением в файл позволит избежать проблемы, так что вы можете сделать это { foo & bar; } | cat - >file
в качестве обходного пути.)