exec и поток ввода

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

exec и поток ввода

Сообщение Folderx »

Захожу в папку где лежит файл x.txt набираю
exec 0<x.txt
консоль закрывается с кодом 127
А в руководстве написано что ввод должен замениться на x.txt

С выводом типа
exec 1>x.txt
всё в порядке

Читал help exec, там написано что-то про закрытие консоли, что-то про execfail а что это.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: exec и поток ввода

Сообщение Uncle_Theodore »

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 и поток ввода

Сообщение Folderx »

Код: Выделить всё

#Пример 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.

Почему он выполняется в скрипте, как сэмулировать скрипт вручную. :cool:
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: exec и поток ввода

Сообщение KiWi »

Folderx писал(а):
14.06.2007 13:57
Вот этот пример работает если его сохранить и запустить, но если его проделывать руками то он закрывается(и в кде и в фоновых консолях) на моменте ввода файла на 0.

Почему он выполняется в скрипте, как сэмулировать скрипт вручную. :cool:

Ну и нормально.
Почему нельзя сэмулировать руками -- подумай на досуге.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: exec и поток ввода

Сообщение Folderx »

KiWi писал(а):
14.06.2007 14:18
Folderx писал(а):
14.06.2007 13:57
Вот этот пример работает если его сохранить и запустить, но если его проделывать руками то он закрывается(и в кде и в фоновых консолях) на моменте ввода файла на 0.

Почему он выполняется в скрипте, как сэмулировать скрипт вручную. :cool:

Ну и нормально.

Для кого нормально для тебя чтоли :happy:

(KiWi) писал(а):Почему нельзя сэмулировать руками -- подумай на досуге.

Ну так если не знаешь зачем в топик писать. Думай на досуге.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: exec и поток ввода

Сообщение Uncle_Theodore »

Folderx писал(а):
14.06.2007 17:30
Ну так если не знаешь зачем в топик писать. Думай на досуге.

Вместо того, чтоб кукситься, попробуй выполнить все команды твоего скрипта вручную. Только все. :)
Начиная с /bin/bash
Примерно вот так

Код: Выделить всё

echo "ls" > data-file
/bin/bash
exec 6<&0
exec < data-file

Ну, что получается? :)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: exec и поток ввода

Сообщение KiWi »

Folderx писал(а):
14.06.2007 17:30
Ну так если не знаешь зачем в топик писать. Думай на досуге.

Я-то знаю, всё вполне просто и логично.

Ладно, несколько вопросов:
- Когда завершается текущий процесс bash?
- Что ты делаешь, перенаправляя ввод из файла?
- А что произойдёт, когда файл закончится?
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: exec и поток ввода

Сообщение Folderx »

Uncle_Theodore, так а дальше вот эти строки

read a1 # Читается первая строка из "data-file".
read a2 # Читается вторая строка из "data-file."

через скрипт они работают, из data-file считываются две строки, а вручную оболочка закрывается и эти риды ждут ввода с клавиатуры естественно(не знают про дескриптор).

- Когда завершается текущий процесс bash?
- Что ты делаешь, перенаправляя ввод из файла?
- А что произойдёт, когда файл закончится?

KiWi, ну вот раз так просто и логично, то как тогда скрипт считывает две строки из файла(у него ничо там не закрывается), и там ещё есть восстановление дескриптора, как я его восстановлю, если у меня консоль уже закрылась :cool:
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: exec и поток ввода

Сообщение KiWi »

Folderx писал(а):
15.06.2007 13:43
KiWi, ну вот раз так просто и логично, то как тогда скрипт считывает две строки из файла(у него ничо там не закрывается), и там ещё есть восстановление дескриптора, как я его восстановлю, если у меня консоль уже закрылась :cool:

Правильно, консоль закрылась, потому что stdin закрылся(процесс-то интерактивный).

Код: Выделить всё

$ cat test.sh
#!/bin/bash
echo $-
$ ./test.sh
hB
$ echo $-
himBH

Найди 3 отличия. :-)
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: exec и поток ввода

Сообщение Folderx »

Да, да, вот я попроще вам пример подобрал :rolleyes:

Код: Выделить всё

#!/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 и поток ввода

Сообщение KiWi »

Не надо переписывать stdin в интерактивном bash'е. Также, как и писать скрипты в интерактивном bash'е, а потом переносить файл -- отличия есть и иногда они бывают очень неприятными.

Если уж так хочется, то read из файла -- read a b c < filename.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: exec и поток ввода

Сообщение Folderx »

KiWi писал(а):
17.06.2007 18:09
Не надо переписывать stdin в интерактивном bash'е.

А что будет то :happy:

KiWi писал(а):
17.06.2007 18:09
Не надо переписывать stdin в интерактивном bash'е. Также, как и писать скрипты в интерактивном bash'е, а потом переносить файл -- отличия есть и иногда они бывают очень неприятными.

Отличия говоришь... В чём отличие интерактивного бэша от неинтерактивного, как из интерактивного бэша сделать неинтерактивный вручную :happy:
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: exec и поток ввода

Сообщение KiWi »

Folderx писал(а):
18.06.2007 00:17
А что будет то :happy:

Правильно, консоль закрылась, потому что stdin закрылся(процесс-то интерактивный).

Переформулирую: интерактивный считывает команды со stdin(surprise!) и после закрытия этого самого stdin выходит. Неинтерактивный -- грубо говоря, из файла и выходит после закрытия файла.

Отличия говоришь...

С экранированием точно когда-то попадались.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: exec и поток ввода

Сообщение Folderx »

KiWi писал(а):
18.06.2007 11:53
Неинтерактивный -- грубо говоря, из файла и выходит после закрытия файла.

То есть exec 0<filename реагирует на закрытие stdin'a будто закончился ввод команд для bash, там короче в 0 передаётся содержимое файла и пытается выполнится в bash, из-за этого видать и код выхода 127

А как, подменить чтоли stdin надо файлом с командами :wacko:
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: exec и поток ввода

Сообщение KiWi »

Folderx писал(а):
19.06.2007 06:32
KiWi писал(а):
18.06.2007 11:53
Неинтерактивный -- грубо говоря, из файла и выходит после закрытия файла.

То есть exec 0<filename реагирует на закрытие stdin'a будто закончился ввод команд для bash, там короче в 0 передаётся содержимое файла и пытается выполнится в bash, из-за этого видать и код выхода 127

А как, подменить чтоли stdin надо файлом с командами :wacko:

Единственное извращение, которое пока пришло в голову:

Код: Выделить всё

exec 6<data-file
read a1 <&6

Ну и так далее.
Спасибо сказали: