Почему « >/dev/console» для удаленного звукового сигнала (команда эха)

Clonezilla requiere que la unidad de destino sea del mismo tamaño o más grande que la unidad de origen. Una forma de evitar esto sería reducir la partición de origen para que tenga el mismo tamaño que la partición de destino.

2
07.06.2019, 15:52
1 ответ

echoзаписывает свой вывод на стандартный вывод. Это его файловый дескриптор 1.

С echo -e '\a', в зависимости от реализации echo, это либо запишет символ BEL (значение 0x7 байтов в ASCII ), за которым следует LF (, также известный как новая строка ), либо после -e \aследует LF или -e , за которыми следуют BEL и LF.

Чтобы написать только символ BEL, лучше написать printf '\a'.

В любом случае это не имеет большого значения для сути вопроса. printf, как и echo, запишет то, что должно записать в свой стандартный вывод.

Если вы введете эту команду в приглашении интерактивной оболочки без перенаправления, стандартный вывод будет унаследован от оболочки. Если оболочка была запущена эмулятором терминала, например xtermили screen, дескриптор файла 1 будет открыт (пользователемxterm)в файле устройства /dev/pt<something>(, см. lsof -ad1 -p "$$"или readlink -f /proc/self/fd/1. ] в Linux ). Это будет подчиненная сторона псевдотерминальной пары -.

Единственное, что здесь важно знать об этом, это то, что это своего рода канал связи. Немного похоже на трубу, за исключением того, что у него есть еще несколько наворотов, которые помогают при взаимодействии с пользователем.

Итак, когда printfзаписывает BEL в этот файл устройства, происходит то, что он передается чему-то на другом конце. В случае xtermэто сам эмулятор терминала. Символ BEL — это управляющий символ, который заставляет терминал и эмуляторы терминала каким-то образом предупреждать пользователя(\ais for alert ). Это может быть звуковой сигнал, звуковой сигнал, визуальное мигание экрана или и то, и другое. xtermобычно использует для этого вызов XBell()X11 API или мигает своим окном, если он настроен на использование визуального звонка.Сам screenпросто пересылает BEL на хост терминал (с ), к которому он подключен, и где это экранное окно активно, или выдает терминалу flash управляющую последовательность или "Вафф, Вафф!!" (sic )сообщение в зависимости от того, как оно было настроено (см.info screen vbell).

Если вы входите на ПК под управлением Linux вне графического сеанса, fd 1 будет открыт (пользователемgetty)на /dev/tty<1-...>устройстве. Здесь ядро ​​реализует эмулятор терминала и использует монитор для вывода и клавиатуру (с )для ввода. Тот же принцип, когда printfпишет, что там BEL, ядро ​​издает звуковой сигнал динамика ПК.

Когда вы запускаете эту команду в приглашении интерактивной оболочки через ssh, fd 1 также будет псевдо -терминальным устройством (/dev/pt<something>), на этот раз запущенным сервером ssh, который запустил оболочку входа в систему. удаленный пользователь в удаленной системе. На другом конце пары псевдотерминалов -находится сервер ssh. При получении этого BEL (или чего-либо еще, если это имеет значение ), сервер ssh отправляет его через зашифрованное соединение клиенту ssh, а клиент ssh записывает его в свой стандартный вывод, который в конечном итоге попадет в окно терминала. ты сидишь в.

В

printf '\a' > /dev/console

Оболочка открывает файл /dev/consoleв файловом дескрипторе 1 (stdout )перед запуском printf.

Теперь /dev/console, по крайней мере в Linux, — это файл устройства tty, предназначенный для приема системных сообщений. /dev/consoleобычно перенаправляет на другое устройство tty. На ПК по умолчанию это /dev/tty0, который указывает на текущий активный виртуальный терминал, но его можно изменить во время загрузки с помощью параметра ядра console=/dev/anything(, например console=/dev/ttyS0, чтобы сделать его первым последовательным устройством ), и его можно даже изменить (для части вывода )позже, используя TIOCCONSioctl()(, см.xterm -C).

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

Чтобы написать сообщение всем зарегистрированным пользователям, вы также можете использовать приложение wallили приложение writeтолько для одного пользователя (одно терминальное устройство ), при условии, что эти пользователи не отключили эти уведомления (с помощьюmesg n)

5
27.01.2020, 21:55

Теги

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