LINUX.ORG.RU

Работа с pipe-ами


0

1

Добрый день! Не подскажете, как правильно работать с pipe-ми. Хотелось бы, чтобы значение, вводимое пользователем, перенаправлялось в pipe, затем читалось в переменную и выводилось на экран. Пробовала по-разному, обычно скрипт или зависает на приглашении для ввода значения (то есть можно вводить что угодно,но ничего не происходит) или вообще выдает ошибку.

#!/bin/bash rm -f /usr/local/out.pipe pipe=/usr/local/out.pipe mkfifo «$pipe» echo -n «Input value\\n» read «$pipe»<&0 read a < $pipe echo $a Скрипт выдает:

./script.sh Input value

1 ./script.sh: line 6: read: `/usr/local/out.pipe': not a valid identifier Заранее большое спасибо!


А фото будет? Обязательно с надписью: «Привет iZEN»!

alpha3
()

Хотелось бы, чтобы значение, вводимое пользователем, перенаправлялось в pipe, затем читалось в переменную и выводилось на экран

Думаю, на самом деле тебе хочется man dialog.

rm -f /usr/local/out.pipe

Работать под рутом не следует.

tailgunner ★★★★★
()

Не проще использовать текстовый файл?

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

Работать под рутом не следует.

~ > ll -d /usr/local/
drwxrwsr-x 10 root staff 4096 Mar 24 08:05 /usr/local/

По теме:

~ > read ANSWER
lol
~ > echo $ANSWER
lol
Пайп здесь не требуется.

GotF ★★★★★
()
#!/bin/bash

pipe=~/out.pipe

rm -f $pipe
mkfifo $pipe
echo -n Input value:
read to_pipe
(echo $to_pipe > $pipe)&
read from_pipe < $pipe
echo Read from pipe:$from_pipe[/quote]
backbone ★★★★★
()
Ответ на: комментарий от GotF

drwxrwsr-x 10 root staff 4096 Mar 24 08:05 /usr/local/

$ mkfifo /usr/local/ff
mkfifo: cannot create fifo `/usr/local/ff': Permission denied

или у тебя есть основания считать, что Masha в группе staff, а не пустила скрипт от рута? %)

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

Видимо он имеет ввиду, что local часто делают пользовательским.

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

или у тебя есть основания считать, что Masha в группе staff, а не пустила скрипт от рута? %)

Ну, хочется верить. В конце концов, об этом мог позаботиться админ.

GotF ★★★★★
()

Хотелось бы, чтобы значение, вводимое пользователем, перенаправлялось в pipe, затем читалось в переменную и выводилось на экран.

Лабораторка по информатике?

Запись в трубу блокируется, пока из нее никто не читает.

P.S. для скрипта используй лоркод.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от backbone

Спасибо большое за скрипт,он работает! Хотелось бы только как-то записать со стандартного ввода в pipe по-другому,если это возможно. Раскрою все карты:хочу попробовать вставить этот скрипт в rpm, соответственно, конструкция read to_pipe для меня недопустима(rpm игнорирует это, не позволяя ничего ввести.)

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

Звучит странно, используется %post hook? Возможно при его запуске stdin-то и не открыт. Zenity не подойдет?

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

Хотелось бы точно понять,что с pipe не проходит...Но,безусловно,можно использовать что-то еще. %post hook - незнакома с этим, что-то подобное можо использовать и в %pre? Может быть,Вы могли посоветовать,где можно почитать про %post hook (мне нужен вод от пользователя в секции %pre) и Zenity?

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

хочу попробовать вставить этот скрипт в rpm

Все в машину!

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

где можно почитать про %post hook

https://wiki.mageia.org/en/Packagers_RPM_tutorial#Pre-_and_Post-installation_...

Установка RPM в отличие от DEB не интерактивная. Вот тут описаны какие-то варианты http://serverfault.com/questions/299544/making-a-rpm-package-installation-non....

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

и Zenity

Это вместо: read a -> a=«$(zenity --entry)». Используется gui-окошко, в зависимости от того, как ставится rpm, может подойти или нет (возможно потребуется проброс X по ssh). И посмотреть опции в man zenity.

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

Спасибо Вам большое! Я все еще надеюсь обойтись без дополнительных скриптов...Хотя,конечно, интерактивный rpm не есть хорошо.

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

read же читает stdin, а если установка rpm неитерактивна, stdin вряд ли открыт (zenity же идет в обход). К тому же, если так просто было - написали бы на SO.

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

Пробую перенаправить стандартный ввод и вывод

#!/bin/bash

pipe=~/out.pipe

rm -f $pipe
mkfifo $pipe
echo -n Input value:
exec 3<> $pipe
read -t 3 from_pipe < $pipe
echo Read from pipe:$from_pipe
Скрипт выдает то,что ввел пользователь, уже после выполнения:

./test.sl Input value:1 [root@localhost SPECS]# 1 bash: 1: command not found

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

«a=$(sh -c 'read a && echo $a')» Что Вы имеете в виду?

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

Если вы так хотите избежать «read from_pipe» - то из %pre stdin родительского терминала адекватными способами не получить.

Например, как предлагали по ссылке backbone. Обертка вокруг пакетного менеджера: читается переменная, в зависимости от значения выполяняется скрипт, устанавливается пакет.

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

Не совсем понимаю,если нетрудно,не могли бы Вы указать,что будет в секции %pre в этом случае.

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

Если я правильно понял, то враппером должен выступать Bash-скрипт типа

#!/bin/bash

pipe=/tmp/out.pipe

rm -f $pipe
mkfifo $pipe
echo -n Input value:
read to_pipe
(echo $to_pipe > $pipe)&

rpm -i $@

rm -f $pipe

В %pre что-то типа

pipe=/tmp/out.pipe

read from_pipe < $pipe
echo Read from pipe:$from_pipe

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

Извините, не совсем понимаю. Мне бы хотелось,чтобы пользователь запускал на установку пакет, а не скрипт.

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

Вообще это мысль,чтобы скрипт и rpm общались как-то через pipe.Спасибо! Пробую еще вот такой скрипт:

#!/bin/bash

pipe=/usr/local/out.pipe

rm -f $pipe
mkfifo $pipe
echo -n Input value:
exec 3<&0 0<$pipe
read from_pipe.
exec 0<&3
echo Read from pipe:$from_pipe
Он зависает... ./test.sl Input value:1

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

В условиях rpm это проблематично. (Можно поместить обертку, с именем как ПМ, перед ним в $PATH и обрабатывать частный случай - но это костыль и нужен root доступ к компьютерам пользователей).

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

Может откроете оставшийся «козырь» и скажете что именно вы хотите реализовать с помощью %pre?

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

Я просто хочу,пусть криво,но реализовать интерактивный rpm.

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

дае в обычных условиях

Нужно запускать одну часть в фоне (& после команды) - чтобы записывающий код состыковался с читающим. Либо использовать неблокирующую запись.

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

Спасибо!

#!/bin/bash

pipe=/usr/local/out.pipe

rm -f $pipe
mkfifo $pipe
echo -n Input value:
exec 3<&0 0<$pipe &
read from_pipe.
exec 0<&3
echo Read from pipe:$from_pipe

Теперь все выполняется,но ему не нравится файловый дескриптер 3:

./test.sl Input value:1 ./test.sl: line 10: 3: Bad file descriptor Read from pipe:1

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

Вообще есть мысль,чтобы rpm, читал не из стандартного ввода,а из pipe. А в pipe со stdin помещал скрипт. Но , если скрипт будет писать в pipe через read to_pipe (echo $to_pipe > $pipe)& боюсь в rpm сработает. Сейчас я использую скрипт:

 #!/bin/bash
rm -f /usr/local/out.pipe
pipe=/usr/local/out.pipe
mkfifo $pipe
echo -e "Input value\\n"
installation \\n 3 - for SormDecoder installat
read c
(echo $c > $pipe) & а в секции %post :
%post
cd /usr/local
pipe=/usr/local/out.pipe
./script.sh
read from_pipe > $pipe
echo Read from pipe:$from_pipe
Пробуюустанавливать собранный пакет: rpm -Uhf Cluster-2.6-1.x86_64.rpm ########################################### [100%] /var/tmp/rpm-tmp.uoJD1D: line 10: $pipe: ambiguous redirect Read from pipe: ########################################### [100%] Input value

1 ^Cerror: %post(Cluster-2.6-1.x86_64) scriptlet failed, signal 2

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

Предлагает ввести значение Input value: и подвисает (Я ввожу 1)

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

не из стандартного ввода,а из pipe.
read from_pipe > $pipe

У вас тут запись.

Вот пример:

#!/bin/bash

pipe=out.pipe
mkfifo "$pipe"

read -p "Input value: " input
echo "$input" > "$pipe" &

# %post
read from_pipe < "$pipe"
echo "Read from pipe: $from_pipe"

wait

Только как вы потом «А в pipe со stdin помещал скрипт.», то есть внешню часть для %pre собираетесь осуществлять?

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

Извините, за неточность. Сейчас у меня есть только секция %post (в которой , как мне хотелось бы в зависимости от того, какой режим выбрал пользователь, производятся определенные действия). %post

cd /usr/local
pipe=/usr/local/out.pipe
./script.sh
read from_pipe < $pipe
echo Read from pipe:$from_pipe
wait

В секции %post значение переменной получаем из pipe. В pipe пишет скрипт ./script.sh

 #!/bin/bash
rm -f /usr/local/out.pipe
pipe=/usr/local/out.pipe
mkfifo $pipe
read -p "Input value:" input
echo "$input" > $pipe &

Пробую установить пакет и не получаю желаемого результата. rpm -Uhf Cluster-2.6-1.x86_64.rpm ########################################### [100%] /var/tmp/rpm-tmp.Dlc4cs: line 10: $pipe: ambiguous redirect Read from pipe: ########################################### [100%] Read from pipe:

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

Может быть,действительно, попробовать другой вариант:при первой попытке установки пакета сообщать пользователю о том,какие параметры поддерживаются при установке. А затем обработывать установку rpm с указанными параметрами. Не подскажете, как это можно реализовать?rpm можно устанавливать со своими специфичными параметрами?

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

./script.sh

Это же самообман. Вы вызываете script.sh из %post, таким образом read в script.sh ничем не отличается от read в %post. Могло бы сработать, если бы сначала был запущен script.sh, а _затем_ произведена установка - но это фактически и есть обертка, упомянутая выше.

Допустим, пользователь устанавливает пакет с помощью графического менеджера, как быть в этом случае?

Предлагаю рассмотреть вариант с флагом первого запуска: если флаг установлен - при запуске предлагается выбрать режим и флаг сбрасывается (например записью first-run = no в конф. файл).

// wait сразу после ... & лишний - он ожидает завершения всех фоновых задач

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

Наполовину, впрочем, может оправдать невменяемое тз.

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

rpm можно устанавливать со своими специфичными параметрами?

Можно задать переменную окружения перед установкой, которую прочитает %post-hook, но такое рекомендовать никто не будет. Да и непонятно, что делать установки не из командной строки.

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

Не могли бы Вы пояснить насчет флага первого запуска? „при запуске предлагается выбрать режим и флаг сбрасывается (например записью first-run = no в конф. файл).“ Вы имеете в виду при попытке установки?Тогда логика „предлагается выбрать режим“ должна быть заключена в rpm и это вновь сводится к чтению из stdin:(

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

Кстати, насчет параметров rpm. http://www.opennet.ru/docs/RUS/rpm_guide/rpm_guide-linux.html.gz#113_html Не свсем понимаю. Вот в этом документе в секции 22.3.5 Скрипты стадий установки и удаления, как следует понимать приведенный пример:

%post 

/sbin/chkconfig --add ypbind 

%preun 

if [ "$1" = 0 ] ; then 

/sbin/service ypbind stop > /dev/null 2>&1 

/sbin/chkconfig --del ypbind 

fi 

exit 0 

%postun 

if [ "$1" -ge 1 ]; then 

/sbin/service ypbind condrestart > /dev/null 2>&1 

fi 

exit 0 
«$1» -это чей параметр???

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

Вы имеете в виду при попытке установки?

Имелось ввиду первое использование программы (если, конечно, «использование» подразумевает запуск).

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

Спасибо! Нет никакой программы,есть только один rpm-пакет.

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