URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9425
[ Назад ]

Исходное сообщение
"Вывод на экран перенаправленного ввода"

Отправлено yahan , 04-Апр-12 21:52 
Что то никак не могу найти как сделать так, чтобы перенавравленный ввод выводился в окно терминала.

Проще пояснить на примере. Есть скрипт test:
read a
echo "a=$a"

Если его запустить и ввести значение 123, то в терминале увидим:
123
a=123

А если выполнить test<<<123, то вывод будет:
a=123


Содержание

Сообщения в этом обсуждении
"Вывод на экран перенаправленного ввода"
Отправлено DeadLoco , 05-Апр-12 00:49 
> А если выполнить test<<<123, то вывод будет:
> a=123

ПОтому что в терминале включено echo. Сама программа, принимающая стдин с терминального стдаута, ничего никуда не выводит. Если нужно эмулировать поведение терминала - нужно дописывать еще одно echo.


"Вывод на экран перенаправленного ввода"
Отправлено Andrey Mitrofanov , 05-Апр-12 10:22 
> Что то никак не могу
> read a
> echo "a=$a"

read -s a
echo "$a"
echo "a=$a"

:-D


"Вывод на экран перенаправленного ввода"
Отправлено yahan , 06-Апр-12 01:51 
))

Хочу уточнить зачем мне это надо. Перенаправленный ввод является набором команд (одна строчка - одна команда). Каждая команда выполняется достаточно долго. Надо видеть на экране какая команда обрабатывается в данный момент. Ввод перенаправляется на вход бинарного файла.
Сейчас вижу только вывод бинарника, а что ему поступает на вход не видно. Как включить эхо?


"Вывод на экран перенаправленного ввода"
Отправлено DeadLoco , 06-Апр-12 11:14 
> Сейчас вижу только вывод бинарника, а что ему поступает на вход не
> видно. Как включить эхо?

read -s a
echo "$a"
echo "a=$a"


"Вывод на экран перенаправленного ввода"
Отправлено yahan , 06-Апр-12 12:58 
>> Сейчас вижу только вывод бинарника, а что ему поступает на вход не
>> видно. Как включить эхо?
> read -s a
> echo "$a"
> echo "a=$a"

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

Хочу чтобы было так:
#progpam_x < cmd.txt
-> abc
Ok
-> 321
Error

А получаю:
#progpam_x < cmd.txt
->
Ok
->
Error

Если сделать по вашему образу и подобию, то получится нечто другое:
#cat cmd.txt
#progpam_x < cmd.txt
abc
321
->
Ok
->
Error


"Вывод на экран перенаправленного ввода"
Отправлено Andrey Mitrofanov , 06-Апр-12 13:03 
> Да я эту мысль уже понял. Скрипт с примером я написал, чтобы
> Хочу чтобы было так:
> А получаю:

Заморочки на самом деле в терминал против пайп или типа того. Эхо выводит твой _терминал, а програма читает со стдин-а.

Попробуй какой-нибудь expect -- может с ним сложется, как хочется.


"Вывод на экран перенаправленного ввода"
Отправлено yahan , 06-Апр-12 14:29 
>> Да я эту мысль уже понял. Скрипт с примером я написал, чтобы
>> Хочу чтобы было так:
>> А получаю:
> Заморочки на самом деле в терминал против пайп или типа того. Эхо
> выводит твой _терминал, а програма читает со стдин-а.
> Попробуй какой-нибудь expect -- может с ним сложется, как хочется.

Спасибки, про expect был не в курсе - полезная штука.
Если честно не думал, что все так сложно. Получается, что есть пайп, его прога потихоньку читает, и надо просто выводить эхом в терминал то, что в данный момент читается из пайпа. Типа tee, только все наоборот )))). Ан нет не все так просто...

понравилась конструкция вида:
program_x<< EOF
тили-лили
тарали-вали
EOF

Но отсутствие отображения в терминале перенаправленного ввода несколько портят впечатления...


"Вывод на экран перенаправленного ввода"
Отправлено LSTemp , 27-Апр-12 22:12 
>[оверквотинг удален]
> Если честно не думал, что все так сложно. Получается, что есть пайп,
> его прога потихоньку читает, и надо просто выводить эхом в терминал
> то, что в данный момент читается из пайпа. Типа tee, только
> все наоборот )))). Ан нет не все так просто...
> понравилась конструкция вида:
> program_x<< EOF
> тили-лили
> тарали-вали
> EOF
> Но отсутствие отображения в терминале перенаправленного ввода несколько портят впечатления...

read i
c="bla-bla $i"
echo $c
eval $c

как-то так ИМХО


"Вывод на экран перенаправленного ввода"
Отправлено LSTemp , 27-Апр-12 22:20 
> ))
> Хочу уточнить зачем мне это надо. Перенаправленный ввод является набором команд (одна
> строчка - одна команда). Каждая команда выполняется достаточно долго. Надо видеть
> на экране какая команда обрабатывается в данный момент. Ввод перенаправляется на
> вход бинарного файла.
> Сейчас вижу только вывод бинарника, а что ему поступает на вход не
> видно. Как включить эхо?

cat c.txt|\
while read i
do
    echo "input: $i"
    c="bla--bla-$i"
    echo "command: $c"
    echo $c|бинарник
done



"Вывод на экран перенаправленного ввода"
Отправлено yahan , 28-Апр-12 15:36 
> cat c.txt|\
> while read i
> do
>     echo "input: $i"
>     c="bla--bla-$i"
>     echo "command: $c"
>     echo $c|бинарник
> done

Интересный вариант, спасибо!
Только при таком способе бинарник будет запускаться столько раз, сколько строк в c.txt.
А это не всегда работает (некоторые команды многострочные, некоторые надо обязательно выполнять внутри одной сессии). Похоже, просто придется написать набор скриптов в отдельных файлах и потом ими пользоваться.


"Вывод на экран перенаправленного ввода"
Отправлено LSTemp , 02-Май-12 20:56 
>[оверквотинг удален]
>>     c="bla--bla-$i"
>>     echo "command: $c"
>>     echo $c|бинарник
>> done
> Интересный вариант, спасибо!
> Только при таком способе бинарник будет запускаться столько раз, сколько строк в
> c.txt.
> А это не всегда работает (некоторые команды многострочные, некоторые надо обязательно выполнять
> внутри одной сессии). Похоже, просто придется написать набор скриптов в отдельных
> файлах и потом ими пользоваться.

может тебе лучше посмотреть что-то вроде expect (http://ru.wikipedia.org/wiki/Expect)?
как раз под автоматизированный ввод команд заточка...


"Вывод на экран перенаправленного ввода"
Отправлено Andrey Mitrofanov , 03-Май-12 09:44 
> Что то никак не могу найти как сделать так, чтобы перенавравленный ввод
> выводился в окно терминала.

Я тебе расскажу, как это работает. Я тебе даже скажу, _почему перенаправленны не выводится в окно терминала. (И даже дам ещё один совет, который тебе опять не понДравится: хочешь подробного "видения", пиши логи.)

> Проще пояснить на примере. Есть скрипт test:
> read a
> echo "a=$a"

Итак, скрипт. read читает 1 строку в переменную со _своего и, соответственно, _скрипта stdin-а. Скрипт исполняет, ну, скажем, bash.

> Если его запустить и ввести значение 123, то в терминале увидим:
> 123
> a=123

Имеем: stdin и stdout скрипта -- на каком-нибудь /dev/pts/7. У bash-а - они же. bash-у их _дал терминал, скажем, konsole. В _терминале включено т.н. "локальное эхо": всё, что воодит юзер в иксах в этом терминале, он, терминал, _отображает в окошке (эхо!) и даёт на stdin того /dev/pts/7, откуда их (ну, 1 строку), при выполнении команды скрипта read, и читает тот самый bash и кладёт её, строку, в переменную и т.д.

Итого: строка в переменной, эхо на терминале. Заметь, эхо на экран положил не скрипт, не баш, а _терминал.

> А если выполнить test<<<123, то вывод будет:
> a=123

Случай №2, "сложный-непонятный, детективно запутанный": выполняя директиву переназначения стд.ввода ("<<<" в данном случае) _баш перед запуском скрипта "подкючает" ему на stdin непий пайп (см.pipe), в который на вх.конце пишет строку "123". А когда скрипт (и да, тот же, но местами другой!, баш) выполняет чтение из своего stdin никакого чтения из /dev/pts/$NN _терминалом и соотв._эха на его экран не происходит.

Итого: строка в переменной, нет эха на терминале. (А если пожмакать кнопки в терминале, _их он отобразит (=эхо), но на stdin скрипта они не попадут.)

Всё логично, всё работает, как задумано. И теперь, надеюсь, понятно почему.