명령/스크립트를 사용하여 모든 bash 쉘을 새로 고치는 방법은 무엇입니까?

명령/스크립트를 사용하여 모든 bash 쉘을 새로 고치는 방법은 무엇입니까?

파일을 수정할 때마다 .bashrc각 bash 쉘로 이동하여 다시 가져와서 변경 사항을 구현해야 합니다.

더 좋은 방법이 있나요? 한 번 실행되는 특정 명령은 source ~/.bashrc열려 있는 모든 bash 쉘에서 자동으로 작업을 수행합니까?

답변1

아니요, 저는 이것이 가능하다고 생각하지 않습니다. 또한 그렇게 되어서도 안 됩니다. 이는 본질적으로 시작되고 활성화된 셸에 코드를 삽입하는 방법에 해당하며 심각한 보안 위협을 초래할 수 있습니다.

많은 데몬딱 그렇게 하는 것을 목표로 하세요. 일반적인 접근 방식은 구성 파일을 다시 읽은 후 다시 시작하도록 HUP(전화 끊기) 신호를 보내는 것입니다. 다음을 통해 이 작업을 실행할 수 있습니다.

pkill -HUP daemon_name

그러나 bash에서 이 작업을 수행하면 bash가 종료됩니다. 이는 데몬이 아니며 시스템이 데몬처럼 작동하도록 만들지 않습니다.

전체적으로 시간이 지남에 따라 bashrc를 자주 변경하지 않을 수 있으며 이는 큰 문제가 되지 않습니다. 변경 작업을 수행할 때 실행 중인 셸에서 변경 작업을 수행해야 하는 경우 간단히 파일을 리소스로 제공하면 됩니다.

답변2

Bash에는 아무것도 내장되어 있지 않습니다. .bashrc프롬프트가 표시될 때마다 다시 로드하도록 지시하여 이를 수행할 수 있습니다 PROMPT_COMMAND.

## Create a timestamp file, dated like the .bashrc that was read.
## There is a small race condition: if .bashrc is modified as the shell is
## just starting, before getting to this line, this instance won't detect
## that modification.
bashrc_timestamp_file=~/.bashrc-timestamp-$$
touch -r ~/.bashrc "$bashrc_timestamp_file"
## Remove the timestamp file on exit. The timestamp file will be left
## behind on a crash.
trap 'rm "$bashrc_timestamp_file"' EXIT HUP TERM INT QUIT
maybe_reload_bashrc () {
  if [[ ~/.bashrc -nt $bashrc_timestamp_file ]]; then
    . ~/.bashrc
  fi
}
if [[ $PROMPT_COMMAND != *maybe_reload_bashrc* ]]; then
  PROMPT_COMMAND="maybe_reload_bashrc
$PROMPT_COMMAND"
fi

추가 파일에서 해당 값에 액세스하는 것은 번거롭습니다. 또한 파일에 제한이 적용됩니다 .bashrc. 파일은 멱등성이어야 합니다. 즉, 부작용 없이 여러 번 로드할 수 있어야 합니다. 예를 들어 위의 코드 조각에서는 아직 존재하지 않는 경우에만 추가합니다 maybe_reload_bashrc.PROMPT_COMMAND

관련 정보