Решение , размещенное здесь , решает проблему. Решение состоит в том, чтобы изменить размер окна терминала на виртуальной машине.
При настройке в grub2 с использованием этого решения записи как:
GRUB_TERMINAL_OUTPUT="gfxterm"
GRUB_GFXMODE=1024x768x32
GRUB_GFXPAYLOAD=keep
GRUB_GFXPAYLOAD_LINUX=keep
изменяли только разрешение меню Grub (даже при установке 1024x768x32
в PAYLOAD
]) и не решил проблему.
Мне пришлось добавить vga = 0x344
в GRUB_CMDLINE_LINUX
Eso es porque la expansión de tilde ocurre antes que las expansiones variables:
The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and filename expansion.
echo
ing el resultado parece correcto y funciona si lo está -evaluando, pero para un script, deberá hacerlo de manera diferente. tal vez:
#...
homedir=$(getent passwd "$username" | cut -d: -f6)
cp /root/nbu/file1.sh "$homedir"
#...
La expansión de la tilde no funciona si se cita la parte del nombre de usuario:
$ echo ~root ~"root"
/root ~root
(y sucede antes de la expansión variable de todos modos.)
Pero dado que ya está leyendo passwd
en el shell, ¿por qué no hacerlo de forma completa:
#!/bin/bash
getent passwd | while IFS=: read -r user pass uid gid gecos home shell; do
if (( uid % 2 == 0 )); then
echo "uid $uid of user '$user' is even and their home is '$home'";
fi;
done
Si su sistema tiene getent
, probablemente sea mejor usarlo, en lugar de /etc/passwd
directamente.
Por otro lado, dado que realmente no parece necesitar el nombre de usuario para nada, podría hacer que su secuencia de comandos awk
genere el directorio ($6
)en su lugar.
Pareces concentrado, así que no te daré un guion -, pero aquí hay algunos consejos:
Estás usando awk
incorrectamente. Prueba esto en su lugar:
awk -F: -v uid_min=${UID_MIN:-1000} '$3%2==0 && $3>uid_min && $3!=65534{print $6}' /etc/passwd
No hay necesidad de cat
.
Use su salida awk
como entrada a su bucle read
, es decir. while read USER_HOME_DIR ; do... ; done < $(awk...)
. Comprenda que esto significará que solo se debe generar un proceso awk
, mientras que su secuencia de comandos original genera un proceso awk
separado para cada línea, por lo que esto es mucho más eficiente.
Agregue una verificación en su programa awk
para limitarlo a UID por encima de 1000, o sin darse cuenta realizará su copia para muchos usuarios del sistema.
Tenga en cuenta que en #1 anterior, cambié su $1
a $6
para extraer el directorio de inicio del usuario en lugar del nombre del usuario.
Acabo de notar en mi máquina Debian que existe un usuario 'nadie' con UID 65534, por lo que es posible que deba tenerlo en cuenta. Modifiqué la declaración awk
en #1 en consecuencia.
Según el comentario del usuario Jeff Schaller, modifiqué el programa awk
para tener en cuenta un UID mínimo personalizado. El formulario ${UID_MIN:-1000}
significa establecer el valor como 1000 si, de lo contrario, sería nulo o no se establecería.
Creo que puedo hacerlo en una -línea. Mira esto:
eval $(awk -v source="/root/nbu/file1.sh" -v uid_min=${UID_MIN:-1000} -F: '$3%2==0 && $3>uid_min && $3!=65534{printf "cp %s %s ;", source, $6 }' /etc/passwd)
Para legibilidad:
eval $(
awk \
-v source="/root/nbu/file1.sh" \
-v uid_min=${UID_MIN:-1000} \
-F: '
$3%2==0 && $3>uid_min && $3!=65534 {
printf "cp %s %s ;", source, $6
}
' /etc/passwd
)