Bash-스크립트에서 호스트 이름을 변경 한 후 PS1이 올바른 호스트 이름으로 업데이트되지 않음


11

이것은 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을 다른 문자열로 변경 한 다음 다시 되돌려 서 bash가 호스트 이름을 다시 읽도록하여 문제를 해결할 수 있어야합니다.
Jonathan Wakely

1
당신의 현재 $PS1를 우리와 공유 하겠습니까?
Ignacio Vazquez-Abrams

1
정확히 : PS1의 내용은 무엇입니까? echo "$ PS1"sb "[\ u @ \ h \ w] \ $"
Bruce

예, $ PS1에 \ h가 있고 "[\ u @ \ h \ w] \ $"가됩니다.
Joseph Glover

아래 내 의견에서 복사하십시오 ... 불행히도 this (. ~ / .bashrc)는 아무것도하지 않습니다. 또한 export PS1='somestring'; export PS1='[\u@\h \W]\$'터미널에서 스크립트 외부 에서 수행하려고 시도했지만 'somestring'으로 전환했다가 다시 호스트 이름이 변경되지 않았습니다. : \ 프로세스가 시작될 때 \ h가 메모리에 저장 될 수 있으며 시작 후에 변경할 수 없습니까?
Joseph Glover

답변:


7

PS1이 다음과 유사한 경우 :

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

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

exec bash

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


1
따라서 이것은 아마도 터미널을 종료하지 않고도 기능에 가장 근접 할 수 있습니다. 불행히도 여전히 bash의 다른 인스턴스를 한 수준 위로 유지하므로 사용자가 종료하면 이전 인스턴스와 이전 호스트 이름으로 돌아갑니다. 그러나 시작시에만 설정되어 있다는 확인에 감사드립니다! 그것이 내가 생각한 것이었지만 확실하지 않았습니다. 이를 확인할 수있는 출처가 있습니까? 감사!
Joseph Glover

6

두 가지 문제

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

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

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

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

. ./changehost newhostname

선행 점에 유의하십시오.

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


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

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


이해가 안됩니다 export PS1='[\u@'$(hostname)'\h \W]\$' $ (hostname)의 요점은 무엇입니까? \ h 호스트 이름의 짧은 이름이어야합니다. 맞습니까?
Joseph Glover

또한 이전에 명확 export하지 않았지만 스크립트를 실행 한 터미널에서 스크립트 외부 에서조차도 업데이트 된 PS1을 얻지 못합니다. PS1을 다른 것으로 바꿀 수는 있지만 \ h 값은 업데이트되지 않습니다!
Joseph Glover

1

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

uname -S newname

또는

hostname newname

사용중인 OS에 따라

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

PS1="`hostname`'

따라서 실제로을 사용하여 호스트 이름을 변경 hostname newname하면 스크립트를 소싱하지 않고 실행할 때도 호출 터미널에서 영구적입니다. 실행 export PS1='`hostname`'하면 PS1이 새 호스트 이름으로 올바르게 변경되지만 \h변수를 업데이트 할 수 없으면 사용자가 셸을 종료하게합니다.
Joseph Glover

0

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

PS1=$PS1

또는

. ~/.bashrc

불행히도 이것은 아무것도하지 않습니다. 또한 export PS1='somestring'; export PS1='[\u@\h \W]\$'터미널에서 스크립트 외부 에서 수행하려고 시도했지만 'somestring'으로 전환했다가 다시 호스트 이름이 변경되지 않았습니다. : \ 프로세스가 시작될 때 \ h가 메모리에 저장 될 수 있으며 시작 후에 변경할 수 없습니까?
Joseph Glover

@JosephGlover 예, 실행시 읽거나 저장했을 수 있으므로 업데이트하려면 다른 셸을 시작해야합니다.

0

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

나는 그렇게 시도했지만 소싱은 아무것도하지 않는 것 같습니다.
Joseph Glover 16

새로운 대화식 쉘을 시작할 때 변경 사항이 다시 적용됩니까? bash -i

예, 변경된 내용이 반영됩니다.
Joseph Glover

.bash_profile을 사용해보십시오. 그래도 작동하지 않으면 본질적으로 설명을들을 가치가 있습니다. 대부분의 시스템은 초기 런타임에 / etc / profile을 소싱하여 시작한 다음 다른 구성 파일을 원하는 수만큼 제공합니다. 일반적으로 사용자의 / 가정의 설정 마무리 쉘 RC 및 / 또는 프로필로 끝나는

.bash_profile 파일을 소싱했으며 작동하지 않습니다. 그리고 rc 및 프로필 파일의 작동 방식에 대해서도 이미 잘 알고 있지만 설명에 감사드립니다.
Joseph Glover
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.