С помощью bash вы бы написали
while read a b rest; do
printf "%s %-20s %s\n" "$a" "$b" "$rest"
done < info.txt
Устраним основные ошибки:
SIGSTOP
. Символ susp
заставляет линейную дисциплину отправлять SIGTSTP
. Как и во многих других вещах, противоречащих представлениям 1980-х годов о командах login
и su
, корнем поведения здесь является PAM.
Он su
этого не делает. И этого не происходит в операционных системах, отличных от тех, которые используют библиотеку Linux PAM . Например, на BSD, использующих библиотеку OpenPAM, этого не происходит.
Это делает модуль Linux PAM с именем pam_unix
. Точнее, это библиотека -, поставляемая по умолчанию для «разговора» misc_conv()
, вызываемая внутри кода pam_unix
, которая делает это. Он специально маскирует SIGTSTP
во время запроса элемента ввода, якобы для того, чтобы библиотека могла очистить . Вот почему сигнал не доставляется до тех пор, пока ввод не будет введен.
OpenPAM также поставляет модуль pam_unix
PAM. Это вызывает функцию «разговора» по умолчанию openpam_ttyconv()
из библиотеки OpenPAM -. Последний не маскирует сигналы .Нет -, кажется, никто не заметил, что можно приостановить su
при запросе пароля на FreeBSD и др. и терминал останется с выключенным эхом. Возможно, это связано с тем, что операционная -система -поставляла командные -линейные оболочки во FreeBSD, у всех есть библиотеки редактирования строк, которые сразу -настраивают параметры терминала, когда они берут на себя запрос на ввод и выполняют свое собственное эхо. в любом случае.