Обычно нам нужно передать только один аргумент:
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 не существуют до этого.
Ответы:
Я думаю, что вы хотите «Заменить процесс» http://tldp.org/LDP/abs/html/process-sub.html . Он также работает на zsh, хотя у него больше опций и синтаксис может отличаться.
Создает псевдофайл (
/dev/fd/something
) для каждой замены. Это довольно полезно. Команду можно читать только как поток, то есть она не может идти вперед и назад с помощью fseek. Нужно читать это как поток байтов, как канал.Ваши примеры работают как подстановка процесса:
Думайте об этом как об инструменте для использования процесса, и пусть он притворяется файлом без каких-либо временных файлов.
(из моего предыдущего ответа )
источник
Фактически, фигурные скобки сработали, потому что оператор канала подключит стандартные выходы сгруппированных команд к стандартному входу третьего.
Вы можете сказать, что распечатка не из эха, выполнив любую команду, которая не использует стандартный ввод, например
{ echo 1; echo 2;} | echo 3
напечатает 3 вместо 1 \ n2 \ n3.Однако это не то, что вы хотели, потому что две команды в фигурных скобках записывают в один и тот же вывод, что похоже на
cat
их результаты. Чтобы сгенерировать два разных результата для использования в качестве двух аргументов для таких команд, какpaste
, вам нужно будет использовать временный файл или именованный канал.Вы можете использовать
mktemp
для создания уникального временного файла илиmkfifo
для создания файла канала FIFO.источник
Мне нравится xargs. В качестве примера я хочу найти размер всех каталогов данных mysql в / usr / local
xargs
источник