Зазвичай нам потрібно передати лише один аргумент:
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
, здається, працює, вихід відбувається завдяки echo
s, а не 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 не існують перед вами.