"." 및 "소스"를 기본값으로 ~/.zshrc로 설정

"." 및 "소스"를 기본값으로 ~/.zshrc로 설정

매개변수 없이 실행하여 ~/.zshrc리소스를 얻고 싶습니다 .. 그래서 이거:

$ .

다음을 수행해야 합니다.

$ . ~/.zshrc

정상적인 기능은 변함없기를 바랍니다 .. 유일한 차이점은 .매개변수 없이 호출할 때입니다.

가능합니까?

나는 몇 가지 다른 접근 방식을 시도했습니다. 이것은 그 중 하나입니다:

dot_zshrc_or_args() {
    if [[ $# == 0 ]]; then
        \. ~/.zshrc
    else
        filename=$1
        shift
        \. $filename $@
    fi
}
alias .=dot_zshrc_or_args

작동하지 않는 이유에 대한 예는 다음과 같습니다.

$ echo 'echo $#' > count_args.sh
$ delegate() { . ./count_args.sh }
$ delegate foo bar baz

마지막 명령은 echo 여야 3하지만 위의 별칭이 정의된 경우 0에코됩니다..

.근본적인 문제는 쉘이 이를 특별히 처리하여 호출하는 스크립트가 등을 포함한 모든 지역 변수에 액세스할 수 있도록 허용한다는 것입니다 $1. $2따라서 다른 함수를 래핑하려고 하면 .해당 동작이 손실됩니다(위의 예에서처럼).

마음에 떠오르는 두 가지 접근 방식은 다음과 같습니다.

  1. 함수 대신 별칭을 사용하세요
  2. .다른 함수에서 실행할 때는 사용하지 않고 대화형 셸에서만 별칭을 사용하도록 만듭니다 .

하지만 아무리 노력해도 제대로 작동할 수 없습니다. 가능합니까? (그렇지 않다면 제가 사용할 수 있는 가장 가까운 대안은 무엇입니까? 저의 궁극적인 목표는 ~/.zshrc쉘에서 리소스를 신속하게, 가급적이면 직관적이고 기억하기 쉬운 방식으로 가져올 수 있는 것입니다.)

답변1

이것은 끔찍한 일을 함으로써 이루어질 수 있습니다 accept-line:

function _accept-line() {
    if [[ $BUFFER == "." ]]; then
        BUFFER="source ~/.zshrc"
    fi
    zle .accept-line
} 

zle -N accept-line _accept-line

답변2

필요에 따라 내장 함수를 호출 하려면 functionfor 를 작성하세요 . 또한 쉘 숫자 비교에는 올바르지 않습니다( 이상하고 or가 필요함 )...==test-eq-ne

function . {
    if [[ $# -eq 0 ]]; then
        builtin . ~/.zshrc
    else
        builtin . "$@"
    fi
}

관련 정보