Bash - PS1 não está atualizando com o nome do host apropriado após a alteração do nome do host no script

8

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

Eu quero 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 de host adequado. Como faço isso acontecer?

Eu corro isto

#!/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 assim e obtenha isso

[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 somente quando eu 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 de volta, mas o nome do host não é alterado. : \

É 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?

    
por Joseph Glover 05.10.2015 / 19:14

5 respostas

6

Se o seu PS1 é 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 mudança para um script de shell que segue o código de execução após a alteração do nome do host. Acredito que não é possível manter o mesmo script sendo executado com um nome de host atualizado e \h . Mas também acredito que não é isso que você está pedindo.

    
por 06.10.2015 / 04:08
5

dois problemas

PS1 é definido uma vez, você precisa redefinir quando o nome do host for alterado.

Você pode editar o script com

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

no final, mas o script deve ser executado como

. ./changehost newhostname

anote o ponto principal.

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 nome do host (username) da atualização do bash (armazenado em / h, / u), uma vez em execução, é improvável que esses valores sejam alterados.

No entanto, bash cuida do PATH.

    
por 05.10.2015 / 19:28
1

1) você não alterou o nome do host. Se você realmente gosta de mudar o nome do host, você precisa ligar:

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 com \h . Se você gosta de ver sempre o nome do host atual, chame:

PS1="'hostname''
    
por 05.10.2015 / 20:10
0

Parece que o bash não está lendo o nome do host atual em cada tela de prompt, então você precisaria dizer ao bash para relê-lo. Você pode tentar com:

PS1=$PS1

ou

. ~/.bashrc
    
por 03.10.2015 / 04:15
0

É possível definir o nome do host de um sistema diretamente com o utilitário hostname em muitos sistemas operacionais. Entretanto, se você escolher editar os arquivos manualmente, aqui está uma versão aumentada do seu script. Eu adicionei um teste para a existência de argumentos de usuário, backups para os arquivos originais e origem do .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
    
por 03.10.2015 / 17:31

Tags