У вас неправильный тип кавычек около 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
Когда вы используете подстановку процесса с помощью <(...)
или > (...)
, 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 для некоторых целей, связанных с ротацией журналов.
Сато Кацура упомянул UCSPI, интерфейс клиент-серверной программы Unix. Программы, которые придерживаются этого правила, используют стандартный ввод, стандартный вывод и стандартную ошибку как обычно. Но набор инструментов определяет дополнительные стандартные дескрипторы открытых файлов. Существуют и другие наборы инструментов, которые определяют аналогичные стандартные файловые дескрипторы помимо первых трех.
Некоторые из них даже согласуются друг с другом. Подобно stdaux
и stdprn
в качестве стандартных файловых дескрипторов 3 и 4 из мира PC-DOS / DR-DOS / MS-DOS, на самом деле существует последовательное стандартное использование файловых дескрипторов 3, 4 , 5, 6 и 7 в мирах некоторых систем управления терминалами Unix и Linux, управления журналами и клиентского программного обеспечения 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 }'
TCP-сокет-соединение
. nosh Guide . Программное обеспечение. sslclient
. UCSPI-SSL. Суперскрипт. s6-tcpclient
. s6-сеть. Лоран Берко. 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
оба ожидают получить его там.
ptyget
набор инструментов Дэниела Бернштейна)». djbwares . Программное обеспечение. pty-get-tty
. Руководство по эксплуатации . Программное обеспечение. pty-run
. Руководство по телефону . Программное обеспечение. консоль-терминал-эмулятор
. Руководство по эксплуатации . Программное обеспечение. LISTEN_FDS
протокол 3 и выше: стандартное прослушивание
Что такое UCSPI для передачи подключенных сокетов, этот протокол предназначен для передачи прослушивающих сокетов. (Это в названии.) Первоначальный протокол inetd
для прослушивания сокетов заключался в том, что они были стандартным вводом серверного процесса, и это то, что, например, до сих пор выполняет набор инструментов Bercot s6 -etwork. Но в мире systemd идея заключалась в том, чтобы серверные процессы прослушивали более одного сокета одновременно. Так возник этот протокол, который определяет файловые дескрипторы 3 и выше как последовательность N открытых файловых дескрипторов, где N - значение переменной среды LISTEN_FDS
. .
Таким образом, хотя это может и не быть явным в их руководствах, каждая серверная программа, которая включает этот протокол, имеет ожидаемый набор файловых дескрипторов «стандартного прослушивания».
На страницах руководства для таких инструментов, как tcp-socket-listen
, которые принимают и добавляют дескрипторы файлов сокетов прослушивания, эти дескрипторы файлов явно упоминаются.Они также упоминают менее известный протокол UPSTART_FDS
из мира выскочки.
s6-tcpserver6-socketbinder
. s6-сеть. Лоран Берко. прослушивание сокетов локальной датаграммы
. Руководство по эксплуатации . Программное обеспечение. прослушивание сокетов локального потока
. Руководство по эксплуатации . Программное обеспечение. netlink-датаграмма-сокет-прослушивание
. Руководство по эксплуатации . Программное обеспечение. TCP-сокет-прослушивание
. Руководство по телефону . Программное обеспечение. udp-socket-listen
. Руководство по телефону . Программное обеспечение. фифо-слушай
. Руководство по эксплуатации . Программное обеспечение. 4 и 5: стандартные данные вращения
Как вы уже заметили, соглашение, начатое с multilog
Бернштейна, было соглашением для инструментов, порожденных multilog
и его последователей во время ротации журнала. Все они определяют файловые дескрипторы 4 и 5 как способ передачи данных от запуска к запуску программы фильтра ротации.
3: стандартные учетные данные
Интерфейс Бернштейна контрольный пароль
, первоначально использовавшийся для проверки входа на сервер POP3, определил другой набор инструментов, ожидающих открытия дополнительного файлового дескриптора. И снова это файловый дескриптор 3, в который программа-порождение должна записать или записать учетные данные пользователя, которые проверяет программа проверки пароля.В настоящее время существует целое подсемейство программ, совместимых с checkpassword
.
контрольный пароль
интерфейс ». Интернет-почта . cr.yp.to.