Bash: PS1 no se actualiza con el nombre de host adecuado después del cambio de nombre de host en la secuencia de comandos

11

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?

Joseph Glover
fuente
No se trata de programación, por lo que debería estar en uno de los otros sitios de intercambio de pila, no aquí. Sin embargo, debería poder resolverlo simplemente cambiando PS1 a otra cadena y luego nuevamente, lo que hará que bash vuelva a leer el nombre de host.
Jonathan Wakely
1
¿Ibas a compartir tu corriente $PS1con nosotros?
Ignacio Vazquez-Abrams
1
Exactamente: ¿cuáles son los contenidos de PS1? echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce
Sí, mi $ PS1 tiene el \ h, y resulta ser "[\ u @ \ h \ w] \ $" exactamente.
Joseph Glover
Copia de mi comentario a continuación ... Desafortunadamente esto (. ~ / .Bashrc) no hace nada. 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 ha cambiado. : \ ¿Es posible que el \ h esté almacenado en la memoria cuando comience el proceso y no pueda cambiarse después del inicio?
Joseph Glover

Respuestas:

7

Si tu PS1 es similar a:

export PS1='[\u@\h \W]\$'

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:

exec 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
1
Entonces, esto es probablemente lo más cerca que puedo llegar a mi funcionalidad sin salir del terminal. Desafortunadamente, todavía deja la otra instancia de bash un nivel arriba, por lo que cuando el usuario sale, vuelve a la instancia anterior y, por lo tanto, al nombre de host anterior. ¡Pero gracias por confirmar que solo está configurado en el inicio! Eso era lo que estaba pensando, pero no estaba seguro. ¿Tiene una fuente a la que me pueda indicar que confirme esto? ¡Gracias!
Joseph Glover
6

dos problemas

PS1 se configura una vez, debe restablecer una vez que se cambia el nombre de host.

Puede editar el guión con

export PS1='[\u@'$(hostname)' \W]\$' 

al final, pero el script debe ejecutarse como

. ./changehost newhostname

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.

Archemar
fuente
No entiendo 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?
Joseph Glover
Además, supongo que no estaba claro antes, pero incluso exportfuera 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!
Joseph Glover
1

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:

PS1="`hostname`'
astuto
fuente
Así que realmente cambio el nombre de host, usando hostname newname, y es persistente en el terminal de llamada, incluso cuando ejecuto el script sin obtenerlo. La ejecución export PS1='`hostname`'cambia correctamente la PS1 al nuevo nombre de host, pero si no puedo hacer que la \hvariable se actualice, simplemente haré que el usuario salga del shell.
Joseph Glover
0

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:

PS1=$PS1

o

. ~/.bashrc
Alvaro Gutierrez Perez
fuente
Lamentablemente esto no hace nada. 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 ha cambiado. : \ ¿Es posible que el \ h esté almacenado en la memoria cuando comience el proceso y no pueda cambiarse después del inicio?
Joseph Glover
@JosephGlover Sí, tal vez se lea en el inicio y se almacene, por lo que deberá iniciar otro shell para actualizarlo.
0

Es posible establecer el nombre de host de un sistema directamente con la hostnameutilidad 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.

#!/bin/bash 

# Error if anything goes wrong and report all commands
set -xe

# Test that the user supplied an argument
if [[ "$#" != 1 ]]
then printf "Usage: $0 <newhostname>\n"
     exit 1
fi

# Back up the files first (but don't clobber old backups).
cp -n /etc/hosts /etc/hosts.bak
cp -n /etc/sysconfig/network /etc/sysconfig/network.bak


# Do two seds 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

# Source the user's .bashrc file
. /home/$USER/.bashrc

fuente
Lo he intentado así, pero el abastecimiento no parece hacer nada.
Joseph Glover
¿Se refleja el cambio cuando inicia un nuevo shell interactivo? bash -i
Sí, el cambio se refleja.
Joseph Glover
Pruebe .bash_profile y si eso no funciona, entonces esencialmente se merece una explicación: la mayoría de los sistemas comenzarán buscando / etc / profile en el tiempo de ejecución temprano y luego desde allí obtendrán cualquier número de otros archivos de configuración. generalmente termina con el shell rc y / o el perfil para finalizar la configuración del usuario / inicio
He obtenido mi archivo .bash_profile y no funciona. Y también estoy familiarizado con el funcionamiento de los archivos rc y de perfil, pero gracias por la explicación.
Joseph Glover