Дескрипторы файлов и сценарии оболочки

Нажатие Ctrl+R откроет обратный поиск истории. Теперь начните вводить свою команду, это даст первое соответствие. Путем нажатия Ctrl+R снова (и снова) можно циклически повториться через историю.

mysq(Ctrl+R)

Дал бы:

mysqldump  --add-drop-table -e -q -n -C -u 

Ctrl+R снова:

mysql -u ben.dauphinee -p
32
25.05.2011, 02:24
2 ответа

Во-первых, обратите внимание, что синтаксис для закрытия 5>&- или 6<&-В зависимости от того, читается ли дескриптор файла из записи или из чтения. Кажется, существует опечатка или форматирующий незначительный сбой в том сообщении в блоге.

Вот прокомментированный сценарий.

exec 5>/tmp/foo       # open /tmp/foo for writing, on fd 5
exec 6</tmp/bar       # open /tmp/bar for reading, on fd 6
cat <&6 |             # call cat, with its standard input connected to
                      # what is currently fd 6, i.e., /tmp/bar
while read a; do      # 
  echo $a >&5         # write to fd 5, i.e., /tmp/foo
done                  # 

Здесь нет никакого закрытия. Поскольку все вводы и выводы идут в то же место в этом простом примере, использование дополнительных дескрипторов файлов не необходимо. Вы могли записать

cat </tmp/bar |
while read a; do
  echo $a
done >/tmp/foo

Используя явные дескрипторы файлов становится полезным, когда Вы хотите записать в несколько файлов в свою очередь. Например, рассмотрите сценарий что выходные данные в файл вывода данных и данные регистрации к файлу журнала и возможно сообщениям об ошибках также. Это означает три канала вывода: один для данных, один для журналов и один для ошибок. С тех пор существует только два стандартных дескриптора для вывода, одна треть необходима. Можно звонить exec открыть выходные файлы:

exec >data-file
exec 3>log-file
echo "first line of data"
echo "this is a log line" >&3
…
if something_bad_happens; then echo error message >&2; fi
exec >&-  # close the data output file
echo "output file closed" >&3

Комментарий об эффективности входит, когда у Вас есть перенаправление в цикле, как это (предположите, что файл пуст для начала):

while …; do echo $a >>/tmp/bar; done

При каждом повторении открывается программа /tmp/bar, ищет в конец файла, добавляет некоторые данные и закрывает файл. Более эффективно открыть файл раз и навсегда:

while …; do echo $a; done >/tmp/bar

Когда существует несколько перенаправлений, происходящих в разное время, звоня exec выполнить перенаправления вместо того, чтобы перенести блок в перенаправление становится полезным.

exec >/tmp/bar
while …; do echo $a; done

Вы найдете несколько других примеров перенаправления путем просмотра io-redirection наклейте этот сайт.

44
27.01.2020, 19:37
  • 1
    Любой синтаксис для закрытия дескриптора файла на самом деле делает то же самое. –  user1338062 25.10.2015, 14:18

Каждому открытому файлу назначается файловый дескриптор и файловый дескриптор для стандартный ввод 0 стандартный вывод равен 1
стандартный вывод равен 2 Для открытия дополнительных файлов остаются дескрипторы с 3 по 9.

Возьмем, к примеру,

exec 3>&1 4>&2
exec 1>  /proc/1/fd/1 2>&1

3>&1создает новый дескриптор файла и перенаправляет его на 1, который является STDOUT 4>&2также новый дескриптор файла и перенаправить его на 2, который является STDERR

1> /proc/1/fd/1использует файловый дескриптор сокета 2>&1также перенаправляет все из этого файлового дескриптора на 1, который является STDOUT

Я также узнал об этом совсем недавно, так что не стесняйтесь указать, если я что-то упустил

Ссылки по использованию exec и перенаправлению с использованием описаний файловhttps://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/x13082.html

0
27.03.2020, 06:52

Теги

Похожие вопросы