Для канала конец файла виден потребителю (s )после того, как все производители закрыли свои файловые дескрипторы для канала и потребитель прочитал все данные.
Так, в:
{
echo foo
echo bar
} | cat
cat
увидит конец -файла -, как только завершится второй echo
и cat
прочитает как foo\n
, так и bar\n
. Тебе больше нечего делать.
Следует иметь в виду, что если некоторые из команд в левой части конвейера запускают какой-либо фоновый процесс, этот фоновый процесс унаследует fd для канала (его стандартный вывод ), поэтому cat
не увидит eof, пока этот процесс также не умрет или не закроет свой стандартный вывод. Как и в:
{
echo foo
sleep 10 &
echo bar
} | cat
Вы видите, что cat
не возвращается в течение 10 секунд.
Здесь вы можете перенаправить стандартный вывод sleep
на что-то другое, например /dev/null
, если вы не хотите, чтобы его (не )вывод направлялся наcat
:
{
echo foo
sleep 10 > /dev/null &
echo bar
} | cat
Если вы хотите, чтобы конец канала записи был закрыт до того, как будет запущена последняя команда в подоболочке слева от |
, вы можете закрыть стандартный вывод или перенаправить на эту подоболочку в середине подоболочки с помощью exec
, как:
{
echo foo
exec > /dev/null
sleep 10
} | (cat; echo "cat is now gone")
Однако обратите внимание, что большинство оболочек по-прежнему будут ожидать эту подоболочку в дополнение к команде cat
.Таким образом, хотя вы сразу увидите cat is now gone
(после того, как foo
будет прочитано ), вам все равно придется подождать 10 секунд, пока весь конвейер завершит работу. Конечно, в приведенном выше примере было бы разумнее написать:
echo foo | cat
sleep 10
<<ANYTHING...content...ANYTHING
- это здесь -документ, он предназначен для того, чтобы сделать стандартный ввод команды файлом, содержащим содержимое . Там это было бы бесполезно. \4
— это байт, который при чтении с терминала приводит к сбросу данных, хранящихся на терминальном устройстве, в приложение, читающее с него (, а когда данных нет, read()
возвращает 0, что означает конец -из -файл ). Опять же, бесполезно здесь.
Физический USB-ключ нужен только тогда, когда нужен закрытый ключ, то есть только при первоначальном подключении к SSH-серверу, по крайней мере, при нормальных обстоятельствах.