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

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

이것은 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가 메모리에 저장되고 시작 후에는 변경할 수 없을 수 있습니까?

답변1

PS1이 다음과 같은 경우:

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

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

exec bash

bash를 새 인스턴스로 대체합니다(\h 값 업데이트). 불행하게도 실행 중인 스크립트가 종료됩니다. 호스트 이름이 변경된 후 코드를 실행하는 셸 스크립트를 변경하려면 몇 가지 추가 마법이 필요합니다. 나는 업데이트된 호스트 이름을 사용하는 것이 가능하지 않다고 생각합니다 \h. 그러나 나는 그것이 당신이 요구하는 것이 아니라고 생각합니다.

답변2

두 가지 질문

PS1은 한 번 설정한 후 호스트 이름을 변경한 후 다시 설정해야 합니다.

다음 명령을 사용하여 스크립트를 편집할 수 있습니다.

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

마지막으로 스크립트는 다음과 같이 실행되어야 합니다.

. ./changehost newhostname

주요 포인트에 주목하세요.

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


bash가 실행 후 호스트 이름(사용자 이름) 값(/h, /u에 저장됨)을 업데이트하는지 여부는 확실하지 않습니다. 이러한 값은 변경될 가능성이 낮기 때문입니다.

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

답변3

\hBash가 번역된 값을 업데이트하도록 할 방법은 없습니다 . 시작 시 한 번 읽고 그 이후에는 수정되지 않습니다. 따라서 업데이트된 팁이 필요한 경우 유일한 옵션은 다음과 같습니다.

  • 서브셸 시작 —bash
  • 현재 쉘을 새 쉘로 교체 —exec bash
  • PS1 업데이트, 다음 \h으로 대체 $(hostname)또는 리터럴 문자열

이제 Bash 내부에 대해 자세히 알아보세요. 호스트 이름 값은 current_host_name다음에 정의된 변수 에 저장됩니다 shell.h:113.

extern char *current_host_name;

세 가지 장소에서 사용됩니다 variables.c:695.

temp_var = set_if_not ("HOSTNAME", current_host_name);

parse.y:6039:

case 'h':
case 'H':
  t_host = savestring (current_host_name);
  if (c == 'h' && (t = (char *)strchr (t_host, '.')))
...

그리고 y.tab.c:8333:

case 'h':
case 'H':
  t_host = savestring (current_host_name);
  if (c == 'h' && (t = (char *)strchr (t_host, '.')))
...

shell_initialize()다음 함수에서 (빈 문자열로 초기화하는 것 외에) 한 번만 할당합니다 shell.c:1918.

/* It's highly unlikely that this will change. */
if (current_host_name == 0)
  {
    /* Initialize current_host_name. */
    if (gethostname (hostname, 255) < 0)
      current_host_name = "??host??";
    else
      current_host_name = savestring (hostname);
  }

모든 줄 번호와 파일 이름은 소스 bash-5.1.tar.gz코드 에서 가져온 것입니다.kernel.org의 미러링.

답변4

bash가 모든 프롬프트 표시에서 현재 호스트 이름을 읽지 않는 것 같으므로 bash에게 다시 읽으라고 지시해야 합니다. 당신은 시도 할 수 있습니다:

PS1=$PS1

또는

. ~/.bashrc

관련 정보