exec и поток ввода
Модератор: /dev/random
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
exec и поток ввода
Захожу в папку где лежит файл x.txt набираю
exec 0<x.txt
консоль закрывается с кодом 127
А в руководстве написано что ввод должен замениться на x.txt
С выводом типа
exec 1>x.txt
всё в порядке
Читал help exec, там написано что-то про закрытие консоли, что-то про execfail а что это.
exec 0<x.txt
консоль закрывается с кодом 127
А в руководстве написано что ввод должен замениться на x.txt
С выводом типа
exec 1>x.txt
всё в порядке
Читал help exec, там написано что-то про закрытие консоли, что-то про execfail а что это.
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: exec и поток ввода
Folderx писал(а): ↑14.06.2007 03:02Захожу в папку где лежит файл x.txt набираю
exec 0<x.txt
консоль закрывается с кодом 127
А в руководстве написано что ввод должен замениться на x.txt
С выводом типа
exec 1>x.txt
всё в порядке
Читал help exec, там написано что-то про закрытие консоли, что-то про execfail а что это.
Ввод и заменяется на x.txt. Просто, возможно, он проходит слишком быстро, ты не успеваешь заметить.
А закрывается, потому что процесс bash'а в терминале подменяется на процесс, исполняющий то, что стоит после exec'а, а оно, видимо, не интерактивное. Выполнено -- вышли.
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: exec и поток ввода
Код: Выделить всё
#Пример 16-1. Перенаправление stdin с помощью exec
#!/bin/bash
# Перенаправление stdin с помощью 'exec'.
exec 6<&0 # Связать дескр. #6 со стандартным вводом (stdin).
# Сохраняя stdin.
exec < data-file # stdin заменяется файлом "data-file"
read a1 # Читается первая строка из "data-file".
read a2 # Читается вторая строка из "data-file."
echo
echo "Следующие строки были прочитаны из файла."
echo "-----------------------------------------"
echo $a1
echo $a2
echo; echo; echo
exec 0<&6 6<&-
# Восстанавливается stdin из дескр. #6, где он был предварительно сохранен,
#+ и дескр. #6 закрывается ( 6<&- ) освобождая его для других процессов.
#
# <&6 6<&- дает тот же результат.
echo -n "Введите строку "
read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin.
echo "Строка, принятая со stdin."
echo "--------------------------"
echo "b1 = $b1"
echo
exit 0Вот этот пример работает если его сохранить и запустить, но если его проделывать руками то он закрывается(и в кде и в фоновых консолях) на моменте ввода файла на 0.
Почему он выполняется в скрипте, как сэмулировать скрипт вручную.
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: exec и поток ввода
Ну и нормально.
Почему нельзя сэмулировать руками -- подумай на досуге.
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: exec и поток ввода
-
Uncle_Theodore
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: exec и поток ввода
Вместо того, чтоб кукситься, попробуй выполнить все команды твоего скрипта вручную. Только все.
Начиная с /bin/bash
Примерно вот так
Код: Выделить всё
echo "ls" > data-file
/bin/bash
exec 6<&0
exec < data-fileНу, что получается?
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: exec и поток ввода
Uncle_Theodore, так а дальше вот эти строки
read a1 # Читается первая строка из "data-file".
read a2 # Читается вторая строка из "data-file."
через скрипт они работают, из data-file считываются две строки, а вручную оболочка закрывается и эти риды ждут ввода с клавиатуры естественно(не знают про дескриптор).
KiWi, ну вот раз так просто и логично, то как тогда скрипт считывает две строки из файла(у него ничо там не закрывается), и там ещё есть восстановление дескриптора, как я его восстановлю, если у меня консоль уже закрылась
read a1 # Читается первая строка из "data-file".
read a2 # Читается вторая строка из "data-file."
через скрипт они работают, из data-file считываются две строки, а вручную оболочка закрывается и эти риды ждут ввода с клавиатуры естественно(не знают про дескриптор).
- Когда завершается текущий процесс bash?
- Что ты делаешь, перенаправляя ввод из файла?
- А что произойдёт, когда файл закончится?
KiWi, ну вот раз так просто и логично, то как тогда скрипт считывает две строки из файла(у него ничо там не закрывается), и там ещё есть восстановление дескриптора, как я его восстановлю, если у меня консоль уже закрылась
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: exec и поток ввода
Правильно, консоль закрылась, потому что stdin закрылся(процесс-то интерактивный).
Код: Выделить всё
$ cat test.sh
#!/bin/bash
echo $-
$ ./test.sh
hB
$ echo $-
himBHНайди 3 отличия. :-)
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: exec и поток ввода
Да, да, вот я попроще вам пример подобрал
Вывод
Вот как это без скрипта сделать, вручную.
Код: Выделить всё
#!/bin/bash
exec 3<&0
exec 0<>filename
read a
read b
read c
echo \$a = $a \& \$b = $b \& \$c = $c
echo xxx 1>&0
exec 0<&3
exec 3<&-
read d
echo \$d = $d
exit 0
Файл filename:
---
---
---Вывод
Код: Выделить всё
$a = --- & $b = --- & $c = ---
x
$d = x
Файл filename становится:
---
---
---
xxxВот как это без скрипта сделать, вручную.
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: exec и поток ввода
Не надо переписывать stdin в интерактивном bash'е. Также, как и писать скрипты в интерактивном bash'е, а потом переносить файл -- отличия есть и иногда они бывают очень неприятными.
Если уж так хочется, то read из файла -- read a b c < filename.
Если уж так хочется, то read из файла -- read a b c < filename.
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: exec и поток ввода
А что будет то
Отличия говоришь... В чём отличие интерактивного бэша от неинтерактивного, как из интерактивного бэша сделать неинтерактивный вручную
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: exec и поток ввода
Правильно, консоль закрылась, потому что stdin закрылся(процесс-то интерактивный).
Переформулирую: интерактивный считывает команды со stdin(surprise!) и после закрытия этого самого stdin выходит. Неинтерактивный -- грубо говоря, из файла и выходит после закрытия файла.
Отличия говоришь...
С экранированием точно когда-то попадались.
-
Folderx
- Сообщения: 296
- ОС: fedora, mandriva
Re: exec и поток ввода
То есть exec 0<filename реагирует на закрытие stdin'a будто закончился ввод команд для bash, там короче в 0 передаётся содержимое файла и пытается выполнится в bash, из-за этого видать и код выхода 127
А как, подменить чтоли stdin надо файлом с командами
-
KiWi
- Бывший модератор
- Сообщения: 2521
- Статус: статус, статус, статус
Re: exec и поток ввода
Единственное извращение, которое пока пришло в голову:
Код: Выделить всё
exec 6<data-file
read a1 <&6Ну и так далее.