Передача двух аргументов команде с использованием труб
Обычно нам нужно передать только один аргумент:
echo abc | cat echo abc | cat some_file - echo abc | cat - some_file
Есть ли способ передать два аргумента? Что-то вроде
{echo abc , echo xyz} | cat cat `echo abc` `echo xyz`
Я мог бы просто сохранить оба результата в файле сначала
- На OS X, как я могу запустить Cacoa emacs * и * перенести его на передний план?
- С скриптом оболочки, можно сказать, когда он запускается с помощью cron vs run вручную?
- Выполнить сложную задачу для fg?
- Странное поведение strace и setuid: разрешение отклонено под strace, но не работает нормально
- Как я могу взять вывод сценария оболочки и поместить его в файл в командной строке?
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 не существуют перед началом работы.
- Сделать pendrive загрузочным через командную строку Ubuntu
- Сценарий оболочки для исправления неправильных имен файлов?
- Ssh и shell через ssh: как выйти?
- Является ли это специфичным для bash методом вызова скрипта: VARIABLE = value bash somescript
- Запустить сценарий оболочки на OS X без появления окна терминала?
- Как извлечь полный список типов расширений внутри каталога?
- Как авто исходный сценарий оболочки?
- Запустите сценарий в OS X 10.6 при сетевом подключении. (Например, /etc/network/if-up.d/)
Я думаю, вы хотите «Замена процесса» 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