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?
$PS1
conosco?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?Respostas:
Se o seu PS1 for semelhante a:
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:
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
dois problemas
PS1 é definido uma vez, é necessário redefinir uma vez que o nome do host é alterado.
Você pode editar o script com
no final, mas o script deve ser executado como
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.
fonte
export PS1='[\u@'$(hostname)'\h \W]\$'
Qual é o sentido de $ (hostname)? \ h deve ser o nome abreviado do nome do host, correto?export
fora 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!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:fonte
hostname newname
, e ele é persistente no terminal de chamada, mesmo ao executar o script sem buscá-lo. A execuçãoexport PS1='`hostname`'
altera corretamente o PS1 para o novo nome do host, mas se eu não conseguir\h
atualizar a variável, solicitarei que o usuário saia do shell.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:
ou
fonte
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?É possível definir o nome de host de um sistema diretamente com o
hostname
utilitá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.fonte
bash -i