이 명령을 실행하기 위해 왜 두 번 사용해야 합니까?

이 명령을 실행하기 위해 왜 두 번 사용해야 합니까?

별칭을 만들었고 alias goto="cd $@ && source ~/.zshrc"작동했지만 두 번 실행한 경우에만 가능했습니다. 한 쉘에서 두 번 실행하더라도 다른 디렉토리로 이동하려면 다시 두 번 실행해야 합니다. 왜 그런 겁니까? 어떻게 바꿀 수 있나요?

두 번 입력해야 합니다 goto <dir>. 처음에는 여전히 정상적인 방향으로 가고 있었고, 두 번째에는 목적지에 도달했습니다. 경로를 확인했기 때문에 .zshrc의 소스 코드를 가져와야 합니다.

CURRENT=$PWD
AT_HOME=0
AT_ROOT=0

if [ $PWD = $HOME ]; then
    AT_HOME=1
elif [ $PWD = / ]; then
    AT_ROOT=1
else
    cd ../

    if [ $PWD = $HOME ]; then
        AT_HOME=1
    elif [ $PWD = / ]; then
        AT_ROOT=1
    else
        cd ../

        if [ $PWD = $HOME ]; then
            AT_HOME=1
        elif [ $PWD = / ]; then
            AT_ROOT=1
        fi
    fi
fi

cd $CURRENT

if [ $AT_HOME = 0 ]; then
    if [ $AT_ROOT = 0 ]; then
        ZSH_THEME="prompt-basename"
    else
        ZSH_THEME="prompt-normal"
    fi
else
    ZSH_THEME="prompt-normal"
fi

이는 나에게 전체 경로(/usr/lib/jvm/java-13/bin에서도)를 제공하고 ~/.zshrc를 얻으면 내가 원하는 경로(.../java-13/bin)를 제공합니다. 그건 그렇고, 교체 &&;작동하지 않습니다.

감사해요!

*이것은 stackxchange.com에 대한 나의 첫 번째 질문이므로 너무 가혹하게 말하지 마십시오.

답변1

첫째, 별칭은 함수가 아니며 매개변수를 허용하지 않습니다. 대신 별칭은 간단한 대체입니다. goto foo명령줄에 입력하고 Enter 키를 누르면 쉘은 goto명령줄을 실행하기 전에 별칭 값으로 간단히 대체합니다.

따라서 $@별칭에 전달된 인수는 확장되지 않습니다. 실제로 이 경우에는 다음과 같이 확장됩니다.현재 받고 있는 셸이나 스크립트에 전달된 매개변수. 그렇기 때문에 두 번째 에는 goto잘 작동합니다. 이제 file 을 가져올 때 디렉터리를 매개변수로 전달했으며 별칭을 다시 선언할 때 해당 매개변수로 확장됩니다..zshrc$@

"또한 큰따옴표를 "사용 하고 있으므로 $@확장이별칭을 선언하는 즉시.이런 일이 발생하는지 확인하려면 셸이 별칭을 보기 시작한 직후에 alias인수 없이 입력하세요.

goto매개변수를 처리하려면 매개변수를 함수로 선언해야 합니다 .goto() { cd $@ && ... }

하지만,일반적으로 말하자면, ⚠️당신은해야아니요 source ~/.zshrc. 도트 파일의 내용에 따라 다양한 문제가 발생할 수 있습니다.

반대로, 파일을 변경 .zshrc하고 이를 적용하려면 터미널을 다시 시작하거나(현재 탭/창을 닫고 새 탭을 열어) 셸을 다시 시작해야 합니다( 입력 exec $SHELL).

답변2

말론의 대답은 유효합니다. 별칭을 만드는 대신 다음 기능을 실행했습니다.

function goto {
    cd $@ && exec $SHELL
}

그리고 그것은 훌륭하게 작동합니다. 또한 .zshrc가 호출될 때마다 ~/.zshrc를 가져오는 데 시간이 점점 더 오래 걸린다는 점을 지적했습니다 goto.

관련 정보