Esta es una copia de mi publicación de stackoverflow; Me doy cuenta de que debería haberlo preguntado aquí ...
Quiero ejecutar un script que cambie el nombre de host y que mi solicitud de bash (variable PS1) se actualice inmediatamente con el nombre de host adecuado. ¿Cómo hago que esto suceda?
Yo corro esto
#!/bin/bash
# Usage: ./changehost <newhostname>
#Do two sed's to edit the files for persistent hostname change
sed -i s/$(hostname)/$1/g "/etc/hosts"
sed -i s/$(hostname)/$1/g "/etc/sysconfig/network"
#run the hostname command with new hostname to update it
hostname $1
En una terminal así y consigue esto
[user@host dir]# ./changehost newhostname
[user@host dir]#
Pero lo que quiero es esto
[user@host dir]# ./changehost newhostname
[user@newhostname dir]#
El terminal se actualiza correctamente solo cuando abro un nuevo shell.
También he tratado de hacer
export PS1='somestring'; export PS1='[\u@\h \W]\$'
fuera del script en la terminal y cambia a 'somestring' y viceversa, pero el nombre de host no cambia. : \
¿Es posible que el \ h esté almacenado en la memoria cuando comience el proceso y no pueda cambiarse después del inicio?
$PS1
con nosotros?export PS1='somestring'; export PS1='[\u@\h \W]\$'
fuera del script en la terminal y cambia a 'somestring' y viceversa, pero el nombre de host no ha cambiado. : \ ¿Es posible que el \ h esté almacenado en la memoria cuando comience el proceso y no pueda cambiarse después del inicio?Respuestas:
Si tu PS1 es similar a:
El valor de \ h solo se establece en el inicio de bash. Por lo tanto, si cambia el nombre de host, debe iniciar una nueva instancia de bash:
Reemplazará bash por una nueva instancia (con el valor de \ h actualizado). Lamentablemente, saldrá de un script en ejecución. Se necesita otra magia para realizar el cambio de un script de shell que sigue al código de ejecución después del cambio de nombre de host. Creo que no es posible mantener el mismo script ejecutándose con un nombre de host actualizado y
\h
. Pero también creo que eso no es lo que estás pidiendo.fuente
dos problemas
PS1 se configura una vez, debe restablecer una vez que se cambia el nombre de host.
Puede editar el guión con
al final, pero el script debe ejecutarse como
tenga en cuenta el punto inicial.
Si no usa el punto inicial, PS1 se configurará en un nuevo shell temporal y se perderá.
No está claro si bash actualiza el valor del nombre de host (nombre de usuario) (almacenado en / h, / u) una vez que se está ejecutando, ya que es poco probable que esos valores cambien.
Sin embargo, bash cuida la RUTA.
fuente
export PS1='[\u@'$(hostname)'\h \W]\$'
¿Cuál es el punto de $ (nombre de host)? \ h debe ser el nombre corto del nombre de host, ¿correcto?export
fuera del script, en el terminal que ejecuté el script, todavía no obtengo una PS1 actualizada. Tenga en cuenta que puedo cambiar la PS1 a cualquier cosa, ¡pero simplemente el valor \ h no se actualiza!1) no cambiaste el nombre de host. Si realmente desea cambiar el nombre de host, debe llamar a:
uname -S newname
o
hostname newname
dependiendo del sistema operativo que esté utilizando.
2) No está claro si bash vuelve a leer el nombre de host
\h
. Si desea ver siempre el nombre de host actual, llame al:fuente
hostname newname
, y es persistente en el terminal de llamada, incluso cuando ejecuto el script sin obtenerlo. La ejecuciónexport PS1='`hostname`'
cambia correctamente la PS1 al nuevo nombre de host, pero si no puedo hacer que la\h
variable se actualice, simplemente haré que el usuario salga del shell.Parece que bash no está leyendo el nombre de host actual en cada pantalla de solicitud, por lo que deberá decirle a bash que lo vuelva a leer. Puedes probar con:
o
fuente
export PS1='somestring'; export PS1='[\u@\h \W]\$'
fuera del script en la terminal y cambia a 'somestring' y viceversa, pero el nombre de host no ha cambiado. : \ ¿Es posible que el \ h esté almacenado en la memoria cuando comience el proceso y no pueda cambiarse después del inicio?Es posible establecer el nombre de host de un sistema directamente con la
hostname
utilidad en muchos sistemas operativos. Sin embargo, si elige editar los archivos a mano, aquí hay una versión aumentada de su script. Agregué una prueba de la existencia de argumentos del usuario, copias de seguridad de los archivos originales y obtuve el .bashrc del usuario al final del script.fuente
bash -i