Передача двох аргументів команді за допомогою труб


22

Зазвичай нам потрібно передати лише один аргумент:

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не записуючи у файл.


ОНОВЛЕННЯ: На жаль, приклад маскує проблему. Хоча { echo abc ; echo xyz ; } | cat, здається, працює, вихід відбувається завдяки echos, а не cat.

Кращим прикладом може бути те, { 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 не існують перед вами.


1
Це змушує почухати голову. Ви хочете передати дві різні команди одному коту?
user606723

2
Ви знаєте, що "трубопроводи" та "аргументи" - це два абсолютно не пов'язані між собою поняття, правда?
Ігнасіо Васкес-Абрамс

@Ignacio помилка ... Я не так знайомий з Linux, тому я не знаю різниці. Я завжди думав, що трубопровід означає, що попередній результат сприймається як аргумент. Хочете просвітити мене?
goweon

@firebat no, pipe означає прийняти stdout попередньої команди як стандартний вхід наступної команди. Ви все ще можете мати аргументи, які є іншою концепцією.
Багата Гомолка

Крім того, що стосується вашого тексту Оновлення, то висновок походить від кота, просто ви хочете, щоб висловлювання видалися окремими для кота, чого він не може зробити, оскільки вони серіалізуються в один потік.
Багата Гомолка

Відповіді:


17

Я думаю, ви хочете "Замінити процес" 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)

Подумайте про це як про інструмент для використання процесу та дозвольте йому зробити вигляд, що це файл без жодних тимчасових файлів.

(з моєї попередньої відповіді )


2

Фігурні дужки дійсно спрацювали, оскільки оператор труби з'єднає стандартні виходи згрупованих команд до стандартного входу третього.

Ви можете сказати, що роздруківка не з луни, виконавши будь-яку команду, яка не використовує стандартний ввід, наприклад, { echo 1; echo 2;} | echo 3буде надруковано 3 на відміну від 1 \ n2 \ n3.

Однак це не те, що ви хотіли, тому що дві команди в фігурних дужках записуються на один і той же вихід, що нагадує catїх результати. Для створення двох різних результатів, які використовуються як два аргументи для таких команд paste, вам доведеться використовувати тимчасовий файл або іменований канал.

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


Велика подяка за вашу відповідь, я багато днів шукав це рішення і, нарешті, знайшов тут вашу відповідь.
Саїд Фальсафін

2

Мені подобаються xargs. Як приклад, я хочу знайти розмір усіх даних mysql dir під / 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.