bashrc 파일을 편집하고 저장할 때마다 "source .bashrc"를 자동으로 실행할 수 있습니까?
답변1
같은 방법또 다른 대답.bashrc에 대한 편집자의 호출을 2단계 프로세스로 대체하는 함수가 생성될 것이라고 명시합니다.
- .bashrc에서 편집기를 엽니다.
- 소스.bashrc
예를 들어:
vibashrc() { vi $HOME/.bashrc; source $HOME/.bashrc; }
여기에는 몇 가지 단점이 있습니다.
vibashrc
이렇게 하면 구매할 때마다 입력해야 한다는 것을 기억해야 합니다.- 현재 bash 창에서만 발생합니다.
- 변경 여부에 관계없이 .bashrc를 얻으려고 시도합니다.
또 다른 옵션은 bash에 연결하는 것입니다.프롬프트 명령.bashrc 파일이 업데이트된 것을 확인할 때마다(그리고 다음 프롬프트가 표시되기 전에) 모든/모든 bash 쉘에서 .bashrc 기능을 가져옵니다.
.bashrc 파일에 다음 코드를 추가하거나 기존 PROMPT_COMMAND 함수를 확장할 수 있습니다.
prompt_command() {
# initialize the timestamp, if it isn't already
_bashrc_timestamp=${_bashrc_timestamp:-$(stat -c %Y "$HOME/.bashrc")}
# if it's been modified, test and load it
if [[ $(stat -c %Y "$HOME/.bashrc") -gt $_bashrc_timestamp ]]
then
# only load it if `-n` succeeds ...
if $BASH -n "$HOME/.bashrc" >& /dev/null
then
source "$HOME/.bashrc"
else
printf "Error in $HOME/.bashrc; not sourcing it\n" >&2
fi
# ... but update the timestamp regardless
_bashrc_timestamp=$(stat -c %Y "$HOME/.bashrc")
fi
}
PROMPT_COMMAND='prompt_command'
그런 다음 다음에 로그인할 때 bash는 이 함수와 프롬프트 후크를 로드하고 프롬프트가 표시될 때마다 $HOME/.bashrc가 업데이트되었는지 확인합니다. 있는 경우 구문 오류가 있는지 빠르게 확인합니다(set -n
옵션), 파일이 깨끗하면 가져옵니다.
구문 검사와 관계없이 내부 타임스탬프 변수를 업데이트하여 파일을 다시 저장/업데이트하기 전에 파일 로드를 시도하지 않습니다.
답변2
아마도 다음과 같은 쉘 기능이 있을 것입니다:
nano .bashrc ; source .bashrc
아니면 그냥 명령을 실행하시겠습니까?
답변3
.bashrc
bash에게 메시지를 받을 때까지 기다리도록 지시할 수 있습니다.신호. 다음 줄을 다음 줄에 넣으세요 .bashrc
.
trap '. ~/.bashrc' USR1
그런 다음 편집이 완료될 때마다 을(를) .bashrc
보내세요.인터렉티브Bash 신호의 예. (스크립트로 보내지 마십시오! 이렇게 하면 스크립트가 종료됩니다.) 이를 수행하는 완벽한 방법은 없으므로 관련 없는 프로세스가 종료될 위험이 있습니다. 다음 bash 스니펫은 가깝습니다. 인수 없이 터미널(또는 다른 문자 장치, 그러나 실제로는 문제가 되지 않음)의 표준 입력을 사용하여 호출된 bash를 찾습니다.
ps -u "$(id -u)" -o pid= -o args= | while read -r pid args; do
if [[ $args = bash || $args = */bin/bash ]]; then
stdin="$(lsof -p"$pid" | sed -n '/^f0$/ { n; s/^n//p; q; }')"
if [ -c "$stdin" ]; then
kill -USR1 "$pid"
fi
fi
done
또는 신호 방법의 불안정성을 방지하기 위해 bash가 .bashrc
자체 위반 사항을 다시 읽도록 할 수 있습니다. 이 방법의 단점은 방금 파일을 저장했을 때 구문 오류나 논리 오류(예: 무한 루프)가 있어도 파일을 다시 읽는다는 것입니다. PROMPT_COMMAND
이 변수의 내용은 bash가 프롬프트를 표시할 때마다 실행되므로 이를 다음 항목에 입력하세요 .bashrc
.
reread_bashrc () {
if ((SECONDS > bashrc_last_read)); then
. ~/.bashrc
bashrc_last_read=$SECONDS
fi
}
bashrc_last_read=$SECONDS
PROMPT_COMMAND="$PROMPT_COMMAND
reread_bashrc"
이 접근 방식의 한 가지 장점은 명령을 입력할 때 실행되지 않는다는 것입니다. 최소한 을 눌러야 합니다 Enter.
답변4
edit_and_source () {
local tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT RETURN
cp -p "$1" "$tmpfile"
while true; do
command "${EDITOR:-vi}" "$tmpfile"
bash -n "$tmpfile" && break
echo 'There were errors. Re-edit?' >&2
read -p 'Yes/No/Force: '
case "$REPLY" in
[Yy]*) continue ;;
[Ff]*) break ;;
*) return ;;
esac
done
mv "$tmpfile" "$1"
}
이 기능을 사용하면 정의된 편집기를 사용하여(또는 설정되지 않은 경우) 지정된 파일을 편집한 bash
다음 가져올 수 있습니다.$EDITOR
vi
$ edit_and_source ~/.bashrc
편집 후 파일에 오류가 있는 경우 함수는 파일을 다시 편집할지 묻는 메시지를 표시합니다.
/tmp/tmp.ETdo10orcg: line 4: syntax error near unexpected token `('
/tmp/tmp.ETdo10orcg: line 4: ` nt hn thnt();0'
There were errors. Re-edit?
Yes/No/Force: n
"아니요"라고 대답하면 원본 파일은 변경되지 않습니다. "force"(또는 "f"로 시작하는 단어)를 선택하면 해당 파일이 강제로 설치됩니다.