Существуют ли общедоступные программы, использующие более двух файловых дескрипторов?

У вас неправильный тип кавычек около seq $ linecount . У вас есть одинарные кавычки, которые заставляют всю фразу трактоваться как одна строка. Если вы хотите выполнить его и использовать желаемые результаты, используйте обратные кавычки:

`seq $linecount`

или, что еще лучше, используйте синтаксис $ (...) , который выполняет то же самое

for num in $(seq $linecount)

, или вы могли бы сделать это без вообще другая программа:

num=1
while [ "$num" -le "$linecount" ]; do
    ...
    ((num=num+1))
done

Если вы пытаетесь распечатать первые N строк файла, вам, вероятно, следует использовать только head :

head -n "$linecount" misspelled
2
10.08.2016, 14:13
2 ответа

Когда вы используете подстановку процесса с помощью <(...) или > (...) , bash откроет канал для другой программы на произвольном файловом дескрипторе высокого уровня. (Я думаю, что раньше он считал от 10, но теперь он отсчитывает от 63) и передает имя как / dev / fd / N в командной строке первой программы. Это не POSIX, но его поддерживают и другие оболочки (это функция ksh88).

Это не совсем особенность программы, которую вы запускаете, она просто видит / dev / fd / N и пытается открыть его как обычный файл.

В руководстве Autoconf упоминаются некоторые исторические примечания:

Несколько древних систем зарезервировали некоторые файловые дескрипторы. По соглашению, дескриптор файла 3 был открыт в / dev / tty, когда вы входили в систему с восьмого выпуска (1985) по десятый выпуск Unix (1989). Файловый дескриптор 4 специально использовался на Stardent / Kubota Titan (около 1990 г.), хотя сейчас мы не помним, что это было. Обе эти системы устарели, поэтому теперь можно безопасно рассматривать файловые дескрипторы 3 и 4 как любые другие файловые дескрипторы.

Кроме того, когда я выполнял поиск в Google, я нашел программу под названием runit , которая использует файловые дескрипторы 4 и 5 для некоторых целей, связанных с ротацией журналов.

6
27.01.2020, 21:56

Да; множество.

Сато Кацура упомянул UCSPI, интерфейс клиент-серверной программы Unix. Программы, которые придерживаются этого правила, используют стандартный ввод, стандартный вывод и стандартную ошибку как обычно. Но набор инструментов определяет дополнительные стандартные дескрипторы открытых файлов. Существуют и другие наборы инструментов, которые определяют аналогичные стандартные файловые дескрипторы помимо первых трех.

Некоторые из них даже согласуются друг с другом. Подобно stdaux и stdprn в качестве стандартных файловых дескрипторов 3 и 4 из мира PC-DOS / DR-DOS / MS-DOS, на самом деле существует последовательное стандартное использование файловых дескрипторов 3, 4 , 5, 6 и 7 в мирах некоторых систем управления терминалами Unix и Linux, управления журналами и клиентского программного обеспечения UCSPI.

Инструменты на стороне клиента UCSPI

6 и 7: стандартные от сервера и стандартные на сервер

С UCSPI люди обычно в основном помнят протокол на стороне сервера, где серверы обмениваются данными со своими стандартными входами и выходами. Однако на менее запоминающейся стороне клиента такие инструменты, как tcpclient (из UCSPI-TCP Бернштейна), sslclient (из UCSPI-SSL Бакстера / Гиффорда / Хоффмана) и tcp-socket-connect (из набора инструментов nosh) использовать дополнительные стандартные файловые дескрипторы. Клиентские программы, с которыми все они связаны, определяются как ожидающие дескриптора открытого файла 6 при чтении из сети и дескриптора открытого файла 7 как записи в сеть.

В исходный набор инструментов ucspi-tcp Бернштейна входил набор утилит nonce TCP, созданных на основе tcpclient . Например: Вот простой инструмент Бернштейна http @ .(Феликс фон Лейтнер опубликовал более сложную картину десять лет назад.)

#!/bin/sh
echo "GET /${2-} HTTP/1.0
Host: ${1-0}:${3-80}
" | tcpclient -RHl0 -- "${1-0}" "${3-80}" sh -c '
  addcr >&7
  exec delcr <&6
' | awk '/^$/ { body=1; next } { if (body) print }'

Дополнительная литература

инструменты управления терминалом

3, 4 и 5: стандартный ctty, стандартный главный и подчиненный PTY

Исходный набор инструментов PTY Дэниела Дж. Бернштейна включал в набор инструментов дополнительные стандартные определения файловых дескрипторов. Файловый дескриптор 3 был управляющим терминалом (соглашение, которое Бернштейн предложил в своих сопроводительных документах по управлению заданиями в оболочках), файловый дескриптор 4 был главной стороной PTY, а файловый дескриптор 5 был его подчиненной стороной.

Набор инструментов PTY содержит, пожалуй, самый яркий пример инструментов, которые определяют конкретные соглашения об открытых файловых дескрипторах в своих руководствах. На странице руководства ptyspawn обсуждаются файловые дескрипторы 0, 1, 2, 3, 4, 5 и 9.

Инструменты набора инструментов nosh для управления терминалом разделяют некоторые из них. pty-get-tty , например, передает ведущую сторону псевдотерминала, который он открывает как файловый дескриптор 4; и pty-run и console-terminal-emulator оба ожидают получить его там.

Дополнительная литература

  • Джонатан де Бойн Поллард (2016). « ptyget набор инструментов Дэниела Бернштейна)». djbwares . Программное обеспечение.
  • Джонатан де Бойн Поллард (2010). Дэниел Дж. Бернштейн о TTY в UNIX . Часто задаваемые ответы.
  • Джонатан де Бойн Поллард (2014). pty-get-tty . Руководство по эксплуатации . Программное обеспечение.
  • Джонатан де Бойн Поллард (2014). pty-run . Руководство по телефону . Программное обеспечение.
  • Джонатан де Бойн Поллард (2014). консоль-терминал-эмулятор . Руководство по эксплуатации . Программное обеспечение.

LISTEN_FDS протокол

3 и выше: стандартное прослушивание

Что такое UCSPI для передачи подключенных сокетов, этот протокол предназначен для передачи прослушивающих сокетов. (Это в названии.) Первоначальный протокол inetd для прослушивания сокетов заключался в том, что они были стандартным вводом серверного процесса, и это то, что, например, до сих пор выполняет набор инструментов Bercot s6 -etwork. Но в мире systemd идея заключалась в том, чтобы серверные процессы прослушивали более одного сокета одновременно. Так возник этот протокол, который определяет файловые дескрипторы 3 и выше как последовательность N открытых файловых дескрипторов, где N - значение переменной среды LISTEN_FDS . .

Таким образом, хотя это может и не быть явным в их руководствах, каждая серверная программа, которая включает этот протокол, имеет ожидаемый набор файловых дескрипторов «стандартного прослушивания».

На страницах руководства для таких инструментов, как tcp-socket-listen , которые принимают и добавляют дескрипторы файлов сокетов прослушивания, эти дескрипторы файлов явно упоминаются.Они также упоминают менее известный протокол UPSTART_FDS из мира выскочки.

Дополнительная литература

инструменты регистрации

4 и 5: стандартные данные вращения

Как вы уже заметили, соглашение, начатое с multilog Бернштейна, было соглашением для инструментов, порожденных multilog и его последователей во время ротации журнала. Все они определяют файловые дескрипторы 4 и 5 как способ передачи данных от запуска к запуску программы фильтра ротации.

Дополнительная литература

  • Джонатан де Бойн Поллард (2015). « Ведение журнала ». Семейство daemontools . Часто задаваемые ответы.

инструменты управления пользователями

3: стандартные учетные данные

Интерфейс Бернштейна контрольный пароль , первоначально использовавшийся для проверки входа на сервер POP3, определил другой набор инструментов, ожидающих открытия дополнительного файлового дескриптора. И снова это файловый дескриптор 3, в который программа-порождение должна записать или записать учетные данные пользователя, которые проверяет программа проверки пароля.В настоящее время существует целое подсемейство программ, совместимых с checkpassword .

Дополнительная литература

4
27.01.2020, 21:56

Теги

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