Bash 로그인 셸에서 PS1을 변경할 수 없는 이유는 무엇입니까?

Bash 로그인 셸에서 PS1을 변경할 수 없는 이유는 무엇입니까?

이 원격 시스템에 ssh로 접속하면 을(를) 수정할 수 없습니다 PS1. 그러나 ssh를 통해 로그인할 때 로그인하지 않은 Bash를 시작하면 을(를) 수정할 수 있습니다 PS1.

dev ~ ❯ bash --login
dev ~ ❯ echo $PS1
dev \W ❯
dev ~ ❯ PS1="foobar: "
dev ~ ❯ echo $PS1
dev \W ❯
dev ~ ❯ bash
dev ~ ❯ PS1="foobar: "
foobar: echo $PS1
foobar:
foobar: 

다음은 동일한 출력이지만 , echo및 의 시작과 끝에 명령문이 있습니다.~/.bash_profile~/.bash_login~/.profile~/.bashrc

dev ~ ❯ bash --login
bash_profile
bash_login
profile
bashrc
bashrc end
profile end
bash_login end
bash_profile end
dev ~ ❯ echo $PS1
dev \W ❯
dev ~ ❯ PS1="foobar: "
dev ~ ❯ echo $PS1
dev \W ❯
dev ~ ❯ bash
bashrc
bashrc end
dev ~ ❯ PS1="foobar: "
foobar: echo $PS1
foobar:
foobar: 

시스템에서 기본값은 다음 PS1과 같이 설정되어 있는 것으로 보입니다 /etc/bash.bashrc.

PS1='${ENV:-${ENVIRONMENT:-$(basename HOSTNAME)}} \W ❯ '

파일의 출처는 /etc/profile.

# If PS1 is not set, load bashrc || zshenv or set the prompt
# shellcheck disable=SC1091
if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "${BASH}" != '/bin/sh' ]; then
    [ -f /etc/bash.bashrc ] && . /etc/bash.bashrc
  # elif [ "${ZSH-}" ] && [ "${ZSH}" != '/bin/sh' ]; then
  #   [ -f /etc/zshenv ] && . /etc/zshenv
  else
    # lightning symbol \342\232\241
    "${IS_ROOT}" && PS1='\[\342\232\241\] ' || PS1='❯ '
  fi
fi

참고: 결국 PS1에는 ~/.bashrc.

답변1

이 답변을 추가하기 전에 fra-san은 위의 의견에서 이것을 언급했습니다. 신용은 그에게 있습니다.

${PROMPT_COMMAND}뭔가가 프롬프트를 설정하고 있을 수도 있습니다 . 다음 방법으로 문제를 재현할 수 있습니다.

function set_ps1() {
    PS1="hi> "
}

$ PROMPT_COMMAND="set_ps1"
hi> PS1="hello "
hi> 

이 경우 PS1을 설정하려고 하면 "hello"변경되어 작동합니다 PROMPT_COMMAND. PS1프롬프트가 표시되기 전에 기능이 다시 변경됩니다.

답변2

나는 다음을 추가했다 /home/[username]/.bashrc:

unset PROMPT_COMMAND
PS1="[\h:\w] "

이렇게 하면 PROMPT_COMMAND변수가 설정 해제된 다음 변수를 설정할 수 있습니다 PS1.

관련 정보