Разделить промежуточную трубу на переменную - PullRequest
1 голос
/ 10 июня 2019

Рассмотрим следующий игрушечный пример (что я действительно делаю сложнее), где я хочу получить две части информации из одной и той же последовательности команд:

echo 'cats pajamas
hatori hanso
batterang
catwoman
fratstar' > tmp1

answer1=$(grep 'cat' tmp1)
answer2=$(grep 'cat' tmp1 | wc -l)

По сути, я ищу способ, которым нужно только выполнить более раннюю команду (и) в последовательности, в данном случае grep, один раз, все еще получая точно те же значения, хранящиеся в переменныхanswer1 и answer2.Я полагаю, что это будет работать как разделение канала (так сказать) на answer1 и wc -l, с выходом последнего, идущим на answer2.

Обратите внимание, что использование переменной переменной или файла для хранения вывода grep изменит то, что возвращает wc -l.Это мотивирует мой выбор этого игрушечного примера и ограничивает актуальность this , я думаю. Этот вопрос кажется связанным, однако мне не ясно, как можно назначить промежуточную часть другой переменной.Я в настоящее время на bash, хотя альтернативные оболочки являются вариантом.

1 Ответ

2 голосов
/ 10 июня 2019

Используйте tee с парой именованных каналов. (Строго говоря, вы можете сделать это с одним каналом и стандартным выводом grep, но презентация проще с двумя каналами.)

mkfifo p1 p2
grep cat tmp1 | tee p1 p2 > /dev/null &
answer1=$(cat p1)
answer2=$(wc -l < p2)

tee разбивает вывод так, как вы хотите, записывая его в два отдельных канала, которые независимо считываются cat и wc -l позже.

Я предполагаю, что это более применимо к вашему случаю использования, чем answer1=$(grep 'cat' tmp1) и answer2=$(echo "$answer1" | wc -l).

...