/ dev / tty
- это управляющий tty текущего процесса для любого процесса, который фактически открывает этот специальный файл. Это не обязательно устройство виртуальной консоли ( / dev / tty
n ), оно может быть pty , последовательным портом и т. Д. Если управляющий tty не является t виртуальная консоль, то процесс не должен взаимодействовать с консольными устройствами, даже если его псевдоним фактически реализован на системной консоли. Например,для оболочки в эмуляторе терминала под локально запущенным X-сервером указанные программы образуют такую цепочку взаимодействий, как:
Unix shell
⇕ / dev / pts / 2
( ≡ / dev / tty
для своих процессов)
драйвер pty ядра
⇕ / dev / ptmx
эмулятор терминала
⇕ Протокол X Window
X-сервер
⇕ / dev / tty7
(≡ / dev / tty
для сервера)
системная консоль
z x c ↿⇂ [_̈░░]
пользователь
Использование / dev / tty
пользовательскими программами включает:
/ dev / tty0
- это текущая активная (т.е. видимая на мониторе) виртуальная консоль операционной системы . Этот специальный файл вряд ли широко используется системным программным обеспечением, но / dev / console
фактически является «псевдонимом» для tty0
, а / dev / console
имеет большое применение. демонами syslog, а иногда и самим ядром.
Эксперимент, чтобы показать разницу: запустите оболочку root
на tty3
( Ctrl + Alt + F3 ]) или в эмуляторе терминала. Теперь
# sleep 2; echo test >/dev/tty
, затем быстро Ctrl + Alt + F2 , подождите две секунды и Ctrl + Alt ] + что угодно назад.Где вы видите результат?
А теперь тот же тест для / dev / tty0
.
¿No crees que es un poco obvio? ¡Simplemente está generando una cadena aleatoria una vez y almacenándola en la variable ran
y usándola para todas las líneas!
Uso de getline
en una variable desde una tubería
awk '{
str_generator = "tr -dc '[:alnum:]' </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
Cuando usa command | getline var
, la salida del comando se envía a través de una tubería a getline()
y a la variable var
.
También tenga en cuenta que cuando se abre una tubería para la salida, awk
recuerda el comando asociado con él, y las escrituras posteriores al comando se agregan a las escrituras anteriores. Necesitamos hacer una llamada explícita close()
del comando para evitar eso.
Si las comillas simples anidadas -en str_generator
están causando un problema, reemplácelas con su equivalente octal(\047
)
awk '{
str_generator = "tr -dc \047[:alnum:]\047 </dev/urandom | head -c 6"
str_generator | getline random_str
close(str_generator)
print "name " random_str " - " $0
}' file
Ejecutar una instancia de tr -dc '[:alnum:]' </dev/urandom | head -c 6
por línea de entrada sería contraproducente -, sería mejor que hiciera:
<input awk -v rng="LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6" '
{rng | getline r; print "name"r"-"$0}'
Si su entrada no contiene acentos graves ni comillas simples, también puede usar m4
'smkstemp()
:
<input sed "s/.*/mkstemp(name)\`&'/" | m4
Esta variación en un par de las otras respuestas genera cadenas aleatorias fuera deawk
:
LC_ALL=C tr -dc '[:alnum:]' </dev/urandom | fold -w 6 |
awk '{ getline r <"/dev/stdin"; printf("name%s-%s\n", r, $0) }' file
La canalización tr
+ fold
genera un flujo interminable de cadenas aleatorias de seis -caracteres en la entrada estándar de awk
. awk
ignorará la entrada estándar si se proporciona un nombre de archivo, por lo que estas cadenas aleatorias son leídas por getline
desde /dev/stdin
a la variable r
. printf
luego se usa para prefijar las líneas del archivo con la cadena apropiada.
Dado el archivo
123
abc
@#$
esto puede producir
nameFI4L1S-123
name5S8Shr-abc
namebRUjzV-@#$
paste <(base64 -w6 /dev/urandom) input.txt | awk 'NF==2{print $1$2} NF!=2{exit}'
Требования-input.txt должен содержать только один столбец, другими словами, в нем не должно быть табуляции или пробелов, потому что они используют в качестве разделителя по умолчанию awk
иpaste
(только символ табуляции )команды. В противном случае команду необходимо немного изменить.
Примечание:Алфавит Base64 содержит символы +
и /
:Таблица Base64 , если вам нужны только цифры и буквы, вы можете использовать команду base32
-Алфавит Base32 .
Вход
===my_line_a
===my_line_b
===my_line_c
===my_line_d
===my_line_e
===
символов добавлено для ясности.
Выход
LYSdm8===my_line_a
5sSSNt===my_line_b
YVMdkA===my_line_c
3b/nsT===my_line_d
xt/AZO===my_line_e
Без использования awk, простоbash
while read line; do
printf "name%s-%s\n" \
"$(tr -dc '[:alnum:]' </dev/urandom|head -c6)" \
"$line"
done <myfile