/dev/pts/10
является ведомым концом пары псевдотерминальных устройств . На другом конце находится программа, которая открывала главное устройство-клон /dev/ptmx
и получала /dev/pts/10
в виде пары (. Каждый раз, когда вы открываете /dev/ptmx
, вы получаете другое подчиненное устройство ). Соединение между /dev/ptmx
и /dev/pts/10
представляет собой двунаправленную трубу с изгибом .
При открытии приложения эмулятора терминала:
/dev/ptmx
и получает имя другого конца. Он настраивает другой конец и открывает его, Оболочка ничего не делает для установки этих трех файловых дескрипторов, она наследует их от своего родительского процесса. Точно так же его дочерние элементы наследуют файловые дескрипторы оболочки.
Замечание:В системе Linux /dev/stdin
, /dev/stdout
и /dev/stderr
являются реальными файлами, которые посредством серии символических ссылок указывают на /proc/
, /proc/
и /proc/
, которые, в свою очередь, укажите на реальное устройство ввода/вывода :в вашем случае /dev/pts/10
.
Существование этих трех стандартных потоков гарантируется библиотекой C.
Отредактируйте :, чтобы ответить на ваш обновленный вопрос, давайте уточним некоторые моменты ответа:
/proc/pts/*
, считывается терминалом, который его создал и отображает, все, что считывается из /proc/pts/*
, поступает с устройства ввода, подключенного к терминалу, /dev/stdout
часто является символической ссылкой на /proc/self/fd/1
, а /dev/stdin
— на /proc/self/fd/0
. Виртуальная файловая система /proc
заботится о том, чтобы показать каждому приложению /proc/self
как символическую ссылку на /proc/
, где
— идентификатор процесса приложения. /proc//fd
указывают на файлы, конвейеры и другие материалы, открытые приложением или унаследованные от их родителя. Каждое приложение гарантированно имеет три файловых дескриптора, открытых:0
для чтения ввода, 1
для записи вывода, 2
для записи ошибок. В вашем случае это /dev/pts/10
. Если вы не перенаправляете вывод в другой файл, каждая команда, запускаемая оболочкой, записывается в терминал. Исключением из этого правила является ситуация, когда группа процессов вашей команды отличается от группы процессов переднего плана терминала,то запись завершится ошибкой и команде будет отправлено SIGTTOU
. Этим поведением можно управлять с помощью stty tostop
и stty -tostop
:
.
stty tostop
echo "/dev/stdout points to the terminal, but I won't print anything" &
stty -tostop
echo "You can see me" &
#!/usr/bin/env bash
for SERVER in `cat servers.lst`
do
ssh -tttq -o StrictHostKeyChecking=no -o CheckHostIP=no -o ConnectTimeout=5 $SERVER "sudo su -c 'uname -n;uptime;reboot' "
done