команда exec з дескриптором файлів


1

Наведені нижче команди Unix добре працюють, коли я виконую його як скрипт оболонки:

#!/bin/bash
# Redirecting stdin using 'exec'.


exec 6<&0          # Link file descriptor #6 with stdin.
                   # Saves stdin.

exec < data-file   # stdin replaced by file "data-file"

read a1            # Reads first line of file "data-file".
read a2            # Reads second line of file "data-file."

echo
echo "Following lines read from file."
echo "-------------------------------"
echo $a1
echo $a2

echo; echo; echo

exec 0<&6 6<&-
#  Now restore stdin from fd #6, where it had been saved,
#+ and close fd #6 ( 6<&- ) to free it for other processes to use.
#
# <&6 6<&-    also works.

echo -n "Enter data  "
read b1  # Now "read" functions as expected, reading from normal stdin.
echo "Input read from stdin."
echo "----------------------"
echo "b1 = $b1"

echo

exit 0

Але коли я виконую команди окремо в терміналі, наведена нижче команда дає помилку "команда не знайдена":

exec < data-file

Відповіді:


4

Якщо ви даєте команду exec < file, то поточна оболонка bash буде читати вхід з файлу , а не std-in.

Я припускаю, що, коли ви віддаєте команди окремо в терміналі, команда exec працює правильно, і ваша поточна (інтерактивна) оболонка bash починає читати data-file(а не клавіатуру). Я думаю, що файл даних не містить команд bash, і тому bash відповідає командою не знайдено.


Але коли я запускаю його через скрипт оболонки, то також мій файл даних не містить жодних команд bash, але все-таки сценарій працює успішно, він не розуміє такої поведінки.
Pankaj Pandey

Якщо ви запускаєте скрипт оболонки, bash читає команди, які він виконує з файлу, що містить сценарій оболонки. Під час запуску в терміналі bash працює в інтерактивному режимі і читає команди з std-in. Тому якщо ви використовуєте exec <команду в скрипті, вона змінює std-in, який читається командами у файлі сценарію. Якщо ви використовуєте exec <інтерактивну оболонку (як термінал), bash читає команди з того, з чого ви перенаправили її, а не з клавіатури
Nick Sillito

але, як ви вже говорили раніше, exec намагатиметься виконувати будь-які команди, що знаходяться у файлі, у цьому випадку є лише дані, тож, це означає, що він повинен помилятися під час запуску в скрипті оболонки, ryt?
Pankaj Pandey

@Pankaj: Коли оболонка виконує скрипт, оболонка зчитує команди зі сценарію, що не є стандартним вводом . Під час виконання exec <somefileсценарію ви змінюєте стандартний ввід (дескриптор файлу 0), а не дескриптор файлу сценарію. Під час exec <somefileінтерактивного запуску ви просто переключили оболонку з читання команд з термінальної на читання їх із цього файлу.
AlexP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.