Передача двух аргументов команде с использованием труб

Обычно нам нужно передать только один аргумент:

echo abc | cat echo abc | cat some_file - echo abc | cat - some_file 

Есть ли способ передать два аргумента? Что-то вроде

 {echo abc , echo xyz} | cat cat `echo abc` `echo xyz` 

Я мог бы просто сохранить оба результата в файле сначала

 echo abc > file1 echo xyz > file2 cat file1 file2 

Но потом я могу случайно перезаписать файл, что не совсем нормально. Это происходит в неинтерактивном скрипте. В принципе, мне нужен способ передать результаты двух произвольных команд cat без записи в файл.


UPDATE: К сожалению, пример маскирует проблему. Хотя { echo abc ; echo xyz ; } | cat { echo abc ; echo xyz ; } | cat { echo abc ; echo xyz ; } | cat , похоже, работает, выход обусловлен echo , а не cat .

Лучшим примером будет { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d, { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d, { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d, который не работает должным образом.

С

 file1: a,b c,d file2: 1,2 3,4 

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

 b,1 d,3 

ПОСТАНОВИЛИ:

Использовать замену процесса : cat <(command1) <(command2)

В качестве альтернативы, сделайте именованные каналы, используя mkfifo :

 mkfifo temp1 mkfifo temp2 command1 > temp1 & command2 > temp2 & cat temp1 temp2 

Менее элегантный и более многословный, но работает отлично, если вы уверены, что temp1 и temp2 не существуют перед началом работы.

Я думаю, вы хотите «Замена процесса» http://tldp.org/LDP/abs/html/process-sub.html . Он также работает на zsh, хотя у него больше опций, и синтаксис может быть другим.

Он создает псевдофайл ( /dev/fd/something ) для каждой подстановки. Это очень полезно. Команда может читать только как поток, то есть она не может идти вперед и назад с fseek. Он должен читать его как поток байтов, как труба.

Ваши примеры работают как замещение процесса:

 cat <(echo abc) <(echo xyz) paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2) 

Подумайте об этом как о инструменте для использования процесса и притворите его файлом без временных файлов.

(Из моего предыдущего ответа )

Кудрявые фигурные скобки действительно работали, потому что оператор трубы соединяет стандартные выходы сгруппированных команд в стандартный вход третьего.

Вы можете сказать, что распечатка не из эха, запустив любую команду, которая не использует стандартный ввод, например { echo 1; echo 2;} | echo 3 { echo 1; echo 2;} | echo 3 { echo 1; echo 2;} | echo 3 будет печатать 3, а не 1 \ n2 \ n3.

Тем не менее, это не то, что вы хотели, потому что две команды в фигурных скобках записываются на один и тот же вывод, который похож на котировку их результатов. Чтобы создать два разных результата для использования в качестве двух аргументов для команд, таких как paste , вам придется использовать временный файл или именованный канал.

Вы можете использовать mktemp для создания уникального временного файла или mkfifo для создания файла канала FIFO.

Мне нравится xargs. В качестве примера я хочу найти размер всех файлов данных mysql в каталоге / usr / local

 Osx: локальный пользователь $ pwd
 / USR / местные
 Osx: локальный пользователь $ ls |  Grep mysql 
 MySQL
 MySQL-5.0.51a-osx10.5-x86_64
 MySQL-5.0.51b-osx10.5-x86_64
 MySQL-5.1.39-osx10.5-x86_64
 MySQL-5.6.17-osx10.7-x86_64
 Os x: локальный пользователь $ ls |  Grep mysql | sudo xargs du -sh
 4.0K mysql
 2.8G mysql-5.0.51a-osx10.5-x86_64
  10G mysql-5.0.51b-osx10.5-x86_64
  25G mysql-5.1.39-osx10.5-x86_64
 753M mysql-5.6.17-osx10.7-x86_64
 Osx: локальный пользователь $ 

xargs

  • Linux bash iterating и Break
  • Несколько параметров для сценария bash
  • Запуск процесса linux в фоновом режиме
  • Избегайте нежелательного пути в Zip-файле
  • Автоматическое создание томов Truecrypt при времени входа пользователя
  • Пакетное преобразование PNG в JPG в Linux
  • Awk соответствует всему слову
  • Сценарий postinstall для Mac не запущен
  • Как выполнить .sh-файл в Windows?
  • Как вызвать (gui) и использовать пароль root для скрипта?
  • Написание сценариев оболочки, которые будут выполняться на любой оболочке (используя несколько строк shebang?)
  • Interesting Posts
    Давайте будем гением компьютера.