Bash-스크립트에서 호스트 이름을 변경 한 후 PS1이 올바른 호스트 이름으로 업데이트되지 않음 s/$(hostname)/$1/g “/etc/sysconfig/network” #run the hostname command with new

이것은 stackoverflow에서 내 게시물의 사본입니다. 여기에 물어 봤어야한다고 생각합니다.

호스트 이름을 변경하고 적절한 호스트 이름으로 bash 프롬프트 (PS1 변수)를 즉시 업데이트하는 스크립트를 실행하고 싶습니다. 어떻게하면 되나요?

나는 이것을 실행

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

그렇게 터미널에서 이것을 얻으십시오

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

하지만 내가 원하는 것은 이것입니다

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

터미널은 새 쉘을 열 때만 올바르게 업데이트됩니다.

나는 또한 시도했다

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

터미널의 스크립트 외부에서 ‘somestring’으로 전환했다가 다시 전환하지만 호스트 이름은 변경되지 않습니다. : \

프로세스가 시작될 때 \ h가 메모리에 저장 될 수 있습니까? 시작한 후에는 변경할 수 없습니까?



답변

PS1이 다음과 유사한 경우 :

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

\ h 값은 bash 시작시에만 설정됩니다. 따라서 호스트 이름을 변경하면 새 bash 인스턴스를 시작해야합니다.

exec bash

bash를 새 인스턴스로 교체합니다 (\ h 값 업데이트). 안타깝게도 실행중인 스크립트를 종료합니다. 호스트 이름이 변경된 후 실행 코드를 따르는 쉘 스크립트를 변경하려면 다른 마술이 필요합니다. 업데이트 된 호스트 이름과로 동일한 스크립트를 계속 실행할 수 없다고 생각합니다 \h. 그러나 나는 그것이 당신이 요구하는 것이 아니라고 믿습니다.


답변

두 가지 문제

PS1이 한 번 설정되면 호스트 이름이 변경되면 다시 설정해야합니다.

당신은 스크립트를 편집 할 수 있습니다

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

마지막에는 스크립트를 다음과 같이 실행해야합니다.

. ./changehost newhostname

선행 점에 유의하십시오.

선행 점을 사용하지 않으면 PS1이 새로운 임시 셸에 설정되어 손실됩니다.


bash가 호스트 이름 (사용자 이름) 값 (/ h, / u에 저장 됨)을 실행 한 후에는 해당 값이 변경 될 가능성이 없으므로 bash 업데이트인지 확실하지 않습니다.

그러나 bash는 PATH를 관리합니다.


답변

1) 호스트 이름을 변경하지 않았습니다. 호스트 이름을 정말로 변경하려면 다음을 호출해야합니다.

uname -S newname

또는

hostname newname

사용중인 OS에 따라

2) bash가로 호스트 이름을 다시 읽는지 확실하지 않습니다 \h. 항상 현재 호스트 이름을 보려면 다음을 호출하십시오.

PS1="`hostname`'


답변

bash가 각 프롬프트 디스플레이에서 현재 호스트 이름을 읽지 않는 것처럼 보이므로 bash에게 다시 읽도록 지시해야합니다. 당신은 시도 할 수 있습니다 :

PS1=$PS1

또는

. ~/.bashrc


답변

hostname많은 운영 체제 에서 유틸리티 를 사용하여 시스템의 호스트 이름을 직접 설정할 수는 있지만 직접 파일을 편집하도록 선택한 경우 여기에는 스크립트의 기능이 강화 된 버전이 있습니다. 사용자 인수가 있는지 테스트하고 원본 파일을 백업하고 스크립트 끝에서 사용자의 .bashrc를 소싱했습니다.

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


답변