Bash - PS1 non si aggiorna con il nome host corretto dopo la modifica del nome host nello script


11

Questa è una copia del mio post da StackOverflow; Mi rendo conto che avrei dovuto chiedere qui ...

Voglio eseguire uno script che cambi il nome host e che il mio prompt di bash (variabile PS1) si aggiorni immediatamente con il nome host appropriato. Come posso farlo accadere?

Corro questo

#!/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

In un terminale così e prendi questo

[user@host dir]# ./changehost newhostname
[user@host dir]# 

Ma quello che voglio è questo

[user@host dir]# ./changehost newhostname
[user@newhostname dir]# 

Il terminale viene aggiornato correttamente solo quando apro una nuova shell.

Ho anche provato a fare

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

al di fuori dello script nel terminale e passa a "somestring" e viceversa, ma il nome host è invariato. : \

È possibile che \ h sia archiviato in memoria all'avvio del processo e che non possa essere modificato dopo l'avvio?


Non si tratta di programmazione, quindi dovrebbe essere su uno degli altri siti di scambio di stack, non qui. Tuttavia, dovresti essere in grado di risolverlo semplicemente cambiando PS1 in un'altra stringa e poi di nuovo indietro, il che farà sì che bash rileggi il nome host.
Jonathan Wakely,

1
Hai intenzione di condividere la tua corrente $PS1con noi?
Ignacio Vazquez-Abrams,

1
Esatto: quali sono i contenuti di PS1? echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce

Sì, il mio $ PS1 contiene \ h, e sembra essere "[\ u @ \ h \ w] \ $" esattamente.
Joseph Glover,

Copia dal mio commento qui sotto ... Purtroppo questo (. ~ / .Bashrc) non fa nulla. Ho anche provato a fare export PS1='somestring'; export PS1='[\u@\h \W]\$'al di fuori dello script nel terminale e passa a 'somestring' e viceversa, ma il nome host è invariato. : \ È possibile che \ h sia archiviato in memoria all'avvio del processo e non possa essere modificato dopo l'avvio?
Joseph Glover,

Risposte:


7

Se la tua PS1 è simile a:

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

Il valore di \ h è impostato solo all'avvio di bash. Pertanto, se si modifica il nome host, è necessario avviare una nuova istanza bash:

exec bash

Sostituirà bash con una nuova istanza (con il valore di \ h aggiornato). Purtroppo, uscirà da uno script in esecuzione. È necessaria qualche altra magia per apportare la modifica per uno script di shell che segue l'esecuzione del codice dopo la modifica del nome host. Credo che non sia possibile mantenere lo stesso script in esecuzione con un nome host aggiornato e \h. Ma credo anche che non sia quello che stai chiedendo.


1
Quindi questo è probabilmente il più vicino possibile alla mia funzionalità senza uscire dal terminale. Sfortunatamente lascia l'altra istanza di bash di un livello superiore, quindi quando l'utente esce torna alla vecchia istanza e quindi al vecchio nome host. Ma grazie per la conferma che è impostato solo all'avvio! Questo è quello che stavo pensando, ma non ero sicuro. Hai una fonte che potresti indicarmi per confermarlo? Grazie!
Joseph Glover,

6

due problemi

PS1 viene impostato una volta, è necessario reimpostare una volta modificato il nome host.

È possibile modificare lo script con

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

alla fine, ma lo script dovrebbe essere eseguito come

. ./changehost newhostname

notare il punto iniziale.

Se non usi il punto iniziale, PS1 verrà impostato in una nuova shell temporanea e andrà perso.


Non è chiaro se bash aggiorna il valore del nome host (nome utente) (memorizzato in / h, / u) una volta che è in esecuzione poiché è improbabile che tali valori cambino.

Tuttavia bash si prende cura di PATH.


Non capisco export PS1='[\u@'$(hostname)'\h \W]\$' Qual è il punto di $ (nome host)? \ h dovrebbe essere il nome breve del nome host, corretto?
Joseph Glover,

Inoltre, suppongo di non essere stato chiaro prima, ma anche facendo exportal di fuori dello script, nel terminale che ho eseguito lo script, non riesco ancora a ottenere una PS1 aggiornata. Nota, posso cambiare la PS1 con qualsiasi cosa, ma semplicemente il valore \ h non viene aggiornato!
Joseph Glover,

1

1) non hai cambiato il nome host. Se ti piace davvero cambiare il nome host, devi chiamare:

uname -S newname

o

hostname newname

a seconda del sistema operativo in uso.

2) Non è chiaro se bash rileggi il nome host con \h. Se ti piace vedere sempre il nome host corrente, chiama:

PS1="`hostname`'

Quindi in realtà cambio il nome host, usando hostname newname, ed è persistente nel terminale chiamante, anche quando eseguo lo script senza acquistarlo. L'esecuzione export PS1='`hostname`'cambia correttamente la PS1 con il nuovo nome host, ma se non riesco \had aggiornare la variabile, farò semplicemente uscire l'utente dalla shell.
Joseph Glover,

0

Sembra che bash non stia leggendo l'attuale nome host su ogni display del prompt, quindi dovresti dire a bash di rileggerlo. Puoi provare con:

PS1=$PS1

o

. ~/.bashrc

Purtroppo questo non fa nulla. Ho anche provato a fare export PS1='somestring'; export PS1='[\u@\h \W]\$'al di fuori dello script nel terminale e passa a 'somestring' e viceversa, ma il nome host è invariato. : \ È possibile che \ h sia archiviato in memoria all'avvio del processo e non possa essere modificato dopo l'avvio?
Joseph Glover,

@JosephGlover Sì, forse viene letto all'avvio e memorizzato, quindi dovrai lanciare un'altra shell per averlo aggiornato.

0

È possibile impostare il nome host di un sistema direttamente con l' hostnameutilità su molti sistemi operativi, tuttavia se si sceglie di modificare i file a mano ecco una versione aumentata dello script. Ho aggiunto un test per l'esistenza di argomenti utente, i backup per i file originali e fornito il .bashrc dell'utente alla fine dello 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

Ci ho provato in questo modo, ma l'approvvigionamento non sembra fare nulla.
Joseph Glover,

Il cambiamento viene riflesso quando si avvia una nuova shell interattiva? bash -i

Sì, il cambiamento si riflette.
Joseph Glover,

Prova .bash_profile e se ciò non funziona, allora essenzialmente meriti una spiegazione: la maggior parte dei sistemi inizierà con l'approvvigionamento di / etc / profile all'inizio della fase di esecuzione e quindi da lì fonte un numero qualsiasi di altri file di configurazione. generalmente termina con la shell rc e / o il profilo per finalizzare la configurazione dell'utente / home

Ho acquistato il mio file .bash_profile e non funziona. E ho già familiarità con il funzionamento dei file rc e del profilo, ma grazie per la spiegazione.
Joseph Glover,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.