Что то никак не могу найти как сделать так, чтобы перенавравленный ввод выводился в окно терминала.Проще пояснить на примере. Есть скрипт test:
read a
echo "a=$a"Если его запустить и ввести значение 123, то в терминале увидим:
123
a=123А если выполнить test<<<123, то вывод будет:
a=123
> А если выполнить test<<<123, то вывод будет:
> a=123ПОтому что в терминале включено echo. Сама программа, принимающая стдин с терминального стдаута, ничего никуда не выводит. Если нужно эмулировать поведение терминала - нужно дописывать еще одно echo.
> Что то никак не могу
> read a
> echo "a=$a"read -s a
echo "$a"
echo "a=$a":-D
))Хочу уточнить зачем мне это надо. Перенаправленный ввод является набором команд (одна строчка - одна команда). Каждая команда выполняется достаточно долго. Надо видеть на экране какая команда обрабатывается в данный момент. Ввод перенаправляется на вход бинарного файла.
Сейчас вижу только вывод бинарника, а что ему поступает на вход не видно. Как включить эхо?
> Сейчас вижу только вывод бинарника, а что ему поступает на вход не
> видно. Как включить эхо?read -s a
echo "$a"
echo "a=$a"
>> Сейчас вижу только вывод бинарника, а что ему поступает на вход не
>> видно. Как включить эхо?
> 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
> Да я эту мысль уже понял. Скрипт с примером я написал, чтобы
> Хочу чтобы было так:
> А получаю:Заморочки на самом деле в терминал против пайп или типа того. Эхо выводит твой _терминал, а програма читает со стдин-а.
Попробуй какой-нибудь expect -- может с ним сложется, как хочется.
>> Да я эту мысль уже понял. Скрипт с примером я написал, чтобы
>> Хочу чтобы было так:
>> А получаю:
> Заморочки на самом деле в терминал против пайп или типа того. Эхо
> выводит твой _терминал, а програма читает со стдин-а.
> Попробуй какой-нибудь expect -- может с ним сложется, как хочется.Спасибки, про expect был не в курсе - полезная штука.
Если честно не думал, что все так сложно. Получается, что есть пайп, его прога потихоньку читает, и надо просто выводить эхом в терминал то, что в данный момент читается из пайпа. Типа tee, только все наоборот )))). Ан нет не все так просто...понравилась конструкция вида:
program_x<< EOF
тили-лили
тарали-вали
EOFНо отсутствие отображения в терминале перенаправленного ввода несколько портят впечатления...
>[оверквотинг удален]
> Если честно не думал, что все так сложно. Получается, что есть пайп,
> его прога потихоньку читает, и надо просто выводить эхом в терминал
> то, что в данный момент читается из пайпа. Типа tee, только
> все наоборот )))). Ан нет не все так просто...
> понравилась конструкция вида:
> program_x<< EOF
> тили-лили
> тарали-вали
> EOF
> Но отсутствие отображения в терминале перенаправленного ввода несколько портят впечатления...read i
c="bla-bla $i"
echo $c
eval $cкак-то так ИМХО
> ))
> Хочу уточнить зачем мне это надо. Перенаправленный ввод является набором команд (одна
> строчка - одна команда). Каждая команда выполняется достаточно долго. Надо видеть
> на экране какая команда обрабатывается в данный момент. Ввод перенаправляется на
> вход бинарного файла.
> Сейчас вижу только вывод бинарника, а что ему поступает на вход не
> видно. Как включить эхо?cat c.txt|\
while read i
do
echo "input: $i"
c="bla--bla-$i"
echo "command: $c"
echo $c|бинарник
done
> cat c.txt|\
> while read i
> do
> echo "input: $i"
> c="bla--bla-$i"
> echo "command: $c"
> echo $c|бинарник
> doneИнтересный вариант, спасибо!
Только при таком способе бинарник будет запускаться столько раз, сколько строк в c.txt.
А это не всегда работает (некоторые команды многострочные, некоторые надо обязательно выполнять внутри одной сессии). Похоже, просто придется написать набор скриптов в отдельных файлах и потом ими пользоваться.
>[оверквотинг удален]
>> c="bla--bla-$i"
>> echo "command: $c"
>> echo $c|бинарник
>> done
> Интересный вариант, спасибо!
> Только при таком способе бинарник будет запускаться столько раз, сколько строк в
> c.txt.
> А это не всегда работает (некоторые команды многострочные, некоторые надо обязательно выполнять
> внутри одной сессии). Похоже, просто придется написать набор скриптов в отдельных
> файлах и потом ими пользоваться.может тебе лучше посмотреть что-то вроде expect (http://ru.wikipedia.org/wiki/Expect)?
как раз под автоматизированный ввод команд заточка...
> Что то никак не могу найти как сделать так, чтобы перенавравленный ввод
> выводился в окно терминала.Я тебе расскажу, как это работает. Я тебе даже скажу, _почему перенаправленны не выводится в окно терминала. (И даже дам ещё один совет, который тебе опять не понДравится: хочешь подробного "видения", пиши логи.)
> Проще пояснить на примере. Есть скрипт 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 скрипта они не попадут.)
Всё логично, всё работает, как задумано. И теперь, надеюсь, понятно почему.