Bash - PS1 não atualizando com nome de host apropriado após alteração de nome de host no script

11

Esta é uma cópia da minha postagem do stackoverflow; Sei que deveria ter perguntado aqui ...

Desejo executar um script que altere o nome do host e faça com que meu prompt do bash (variável PS1) seja atualizado imediatamente com o nome do host adequado. Como faço isso acontecer?

Eu corro isso

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

Em um terminal como esse e obtenha este

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

Mas o que eu quero é isso

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

O terminal é atualizado corretamente apenas quando abro um novo shell.

Eu também tentei fazer

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

fora do script no terminal e ele muda para 'somestring' e volta, mas o nome do host permanece inalterado. : \

É possível que o \ h esteja armazenado na memória quando o processo começa e não pode ser alterado após a inicialização?

Joseph Glover
fonte
Não se trata de programação, portanto, deve estar em um dos outros sites de troca de pilha, não aqui. No entanto, você poderá resolvê-lo simplesmente alterando o PS1 para outra string e, em seguida, novamente, o que fará com que o bash releia o nome do host.
Jonathan Wakely
1
Você iria compartilhar sua corrente $PS1conosco?
Ignacio Vazquez-Abrams
1
Exatamente: qual é o conteúdo do PS1? eco "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce
Sim, meu $ PS1 possui o \ h e é exatamente "[\ u @ \ h \ w] \ $".
Joseph Glover
Copie do meu comentário abaixo ... Infelizmente isso (. ~ / .Bashrc) não faz nada. Eu também tentei fazer export PS1='somestring'; export PS1='[\u@\h \W]\$'fora do script no terminal e ele muda para 'somestring' e volta, mas o nome do host é inalterado. : \ É possível que o \ h esteja armazenado na memória quando o processo começa e não pode ser alterado após a inicialização?
Joseph Glover

Respostas:

7

Se o seu PS1 for semelhante a:

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

O valor de \ h é definido apenas na inicialização do bash. Portanto, se você alterar o nome do host, precisará iniciar uma nova instância do bash:

exec bash

Substituirá o bash por uma nova instância (com o valor de \ h atualizado). Infelizmente, ele sairá de um script em execução. Alguma outra mágica é necessária para fazer a alteração de um script de shell que segue a execução do código após a alteração do nome do host. Acredito que não é possível manter o mesmo script em execução com um nome de host atualizado e \h. Mas também acredito que não é isso que você está pedindo.


fonte
1
Portanto, este é provavelmente o mais próximo que posso chegar da minha funcionalidade sem sair do terminal. Infelizmente, ele ainda deixa a outra instância do bash um nível acima; portanto, quando o usuário sai, retorna à instância antiga e, portanto, ao nome do host antigo. Mas obrigado pela confirmação de que ele está definido apenas na inicialização! Era isso que eu estava pensando, mas não tinha certeza. Você tem uma fonte para a qual você poderia me indicar para confirmar isso? Obrigado!
Joseph Glover
6

dois problemas

PS1 é definido uma vez, é necessário redefinir uma vez que o nome do host é alterado.

Você pode editar o script com

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

no final, mas o script deve ser executado como

. ./changehost newhostname

observe o ponto inicial.

Se você não usar o ponto inicial, o PS1 será definido em um novo shell temporário e será perdido.


Não está claro se o valor do bash update hostname (nome de usuário) (armazenado em / h, / u) depois de executado, pois é improvável que esses valores sejam alterados.

No entanto, o bash cuida do PATH.

Archemar
fonte
Não entendo export PS1='[\u@'$(hostname)'\h \W]\$' Qual é o sentido de $ (hostname)? \ h deve ser o nome abreviado do nome do host, correto?
Joseph Glover
Além disso, acho que não estava claro antes, mas mesmo fazendo exportfora do script, no terminal em que o rodou, ainda não recebo um PS1 atualizado. Note, eu posso mudar o PS1 para qualquer coisa, mas simplesmente o valor \ h não é atualizado!
Joseph Glover
1

1) você não alterou o nome do host. Se você realmente deseja alterar o nome do host, precisa ligar para:

uname -S newname

ou

hostname newname

dependendo do sistema operacional que você está usando.

2) Não está claro se o bash relê o nome do host \h. Se você quiser ver sempre o nome do host atual, ligue para:

PS1="`hostname`'
esperto
fonte
Então, na verdade, mudo o nome do host, usando hostname newname, e ele é persistente no terminal de chamada, mesmo ao executar o script sem buscá-lo. A execução export PS1='`hostname`'altera corretamente o PS1 para o novo nome do host, mas se eu não conseguir \hatualizar a variável, solicitarei que o usuário saia do shell.
Joseph Glover
0

Parece que o bash não está lendo o nome do host atual em cada exibição de prompt, portanto, você precisará informar ao bash para relê-lo. Você pode tentar com:

PS1=$PS1

ou

. ~/.bashrc
Alvaro Gutierrez Perez
fonte
Infelizmente isso não faz nada. Eu também tentei fazer export PS1='somestring'; export PS1='[\u@\h \W]\$'fora do script no terminal e ele muda para 'somestring' e volta, mas o nome do host é inalterado. : \ É possível que o \ h esteja armazenado na memória quando o processo começa e não pode ser alterado após a inicialização?
Joseph Glover
@JosephGlover Sim, talvez ele seja lido no lançamento e armazenado, então você precisará iniciar outro shell para atualizá-lo.
0

É possível definir o nome de host de um sistema diretamente com o hostnameutilitário em muitos sistemas operacionais. No entanto, se você optar por editar os arquivos manualmente, há uma versão aumentada do seu script. Eu adicionei um teste para a existência de argumentos do usuário, backups para os arquivos originais e procurei o .bashrc do usuário no final do 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

fonte
Eu tentei assim, mas a terceirização parece não fazer nada.
Joseph Glover
A alteração é refletida quando você inicia um novo shell interativo? bash -i
Sim, a alteração é refletida.
Joseph Glover
Tente .bash_profile e, se isso não funcionar, você merece uma explicação: a maioria dos sistemas começará por fornecer o / etc / profile no início da execução e, a partir daí, origina qualquer número de outros arquivos de configuração. geralmente terminando com o rc shell e / ou perfil para finalizar a configuração do usuário / home
Eu obtive o meu arquivo .bash_profile e ele não funciona. E também já estou familiarizado com o funcionamento dos arquivos rc e de perfil, mas obrigado pela explicação.
Joseph Glover