LINUX.ORG.RU
ФорумAdmin

помогите с конвеером


0

0

Есть конструкция:

(cat /tmp/foo ; echo "bar" ) | script.sh
в этом случае на stdin скрипта поступают вначале содержимое файла foo, а затем слово bar.

Как изменить данную конструкцию, чтобы вместо файла foo использовать вывод предыдущего в конвеере, чтобы было типа такого:

cat /tmp/foo | ( "?" ; echo "bar" ) | script.sh

Что вписать вместо вопроса?


Правильно так:

( cat /tmp/foo; echo "bar" ) | script.sh

По моему это логично (т.е. это исходный вариант). Но можно и так:

cat /tmp/foo | ( cat; echo "bar" ) | script.sh

cat без параметров копируте данные со стандартного ввода на стандартный вывод.

Deleted
()
Ответ на: комментарий от evi9

а возможно ли сделать перенаправление cat сразу в две переменные? Я глупо выражаюсь, но нужно что-то типа такого:

A1=`cat $1 |grep "foo"`
A2=`cat $1 |grep "bar"`

echo $A1,$A2.

В А1 зприсваивается, а в A2 уже не попадает...

evi9
() автор топика
Ответ на: комментарий от evi9

> а возможно ли сделать перенаправление cat сразу в две переменные?

Вряд ли. Хотя возможно есть способ как-то особо извратиться через создание дополнительных файловых дескрипторов + tee. Но это будет скорее злой (очень злой) хак.

Deleted
()
Ответ на: комментарий от ei-grad

> A2=`cat $1 | grep -v foo | grep bar`

Если я правильно понял, ему хочется на'grep'ать из вывода одного
cat'а два раза и записать результаты в *две разные* переменные.
Т.е. как бы

cat $1 --> A1=`grep foo`
       \-> A2=`grep bar`

Deleted
()
Ответ на: комментарий от Deleted

Так что обычным способом это не сделать. Если $1 - это обычный файл,то лучше прочитать его два раза (кстати cat для этого не обязателен - grep сам может читать файлы). А если какой-то поток, в котором данные не повторятся при повторном чтении, то можно при первом прочтении продублировать их в файл или fifo через tee.

Deleted
()

s/конвеером/конвейером

melkor217 ★★★★★
()
Ответ на: комментарий от wfrr

> или через пайп перезать в while read который на каждую строку вызовет нужные команды.

Можно и так. Но шелл для этого скорее всего форкнется в новый процесс, а это не всегда подходит.

Deleted
()
Ответ на: комментарий от Deleted

что-то я поторопился. Неужели нет комманды которая копирует stdout в stdout и stderr? :). Грязные хаки с fifo городить не хочется.

true_admin ★★★★★
()
Ответ на: комментарий от sdio

2sdio: ого...

а вообще я уже сделал проще, может глупо, но работает, вывод просто направил во временный файл, а с ним уже крутил все что мне нужно.

evi9
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.