이것은 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