왜이 쉘 스크립트에 백 슬래시가 포함됩니까? SYSP=$(\dirname “${SYSP}”) fi 나는 앞에 백

conda.sh스크립트 사본에 다음 줄이 표시됩니다.

if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
    SYSP=$(\dirname "${CONDA_EXE}")
else
    SYSP=$(\dirname "${CONDA_EXE}")
    SYSP=$(\dirname "${SYSP}")
fi

나는 앞에 백 슬래시하여 존재 이유에 호기심 d에서 dirname. 나는 그것이 필요하다고 생각하지 않습니다. 이 백 슬래시 사용은 소스 파일의 다른 위치에도 나타납니다. 내가 누락 된 이유는 무엇입니까?



답변

백 슬래시는 별칭 확장을 억제합니다. 즉, 원래 명령을 실행하고 별칭 버전이 실행되지 않도록합니다. 시스템이 설정 shopt -s expand_aliases되었거나 (BASH 만 해당) 또는를 사용하여 스크립트를 실행하면 스크립트가 별칭 확장으로 무의식으로 실행될 수 있습니다 source.

./conda.sh          # usually no alias expansion (unless `shopt -s expand_aliases` in BASH)
source ./conda.sh   # alias expansion
. ./conda.sh        # alias expansion

일부 시스템 관리자는 별칭의 부작용에 대비하여 백 슬래시를 방지하기 위해 백 슬래시를 사용하려고합니다. 예를 들어, 시스템이이를 alias dirname='dirname -z'어딘가에 설정 하고 조건이 별명을 확장 할 수 있도록 허용하는 경우, dirname을 호출하는 스크립트는 불행히도 dirname -z대신 호출 됩니다. 스크립트는 의도하지 않았습니다.

이러한 별칭이 존재하지 않는 것이 확실한 경우 모든 백 슬래시를 제거 할 수 있으며 제대로 작동합니다.

또는 command백 슬래시 버전 대신 별칭을 사용 하지 않을 수 있습니다 . 따라서을 대신하여을 \dirname사용할 수 있습니다 command dirname. (와 같은 내장 명령의 cd경우 builtin대신 사용해야 합니다). 대신 별칭과 같은 이름을 가진 함수를 우회하기 때문에 이것을 선호합니다.


답변

conda.sh소스 파일 인 경우 백 슬래시는 별칭을 무시하기위한 것입니다. Bash는 일반적으로 스크립트 실행을 위해 별칭 확장을 비활성화하지만 대화 형 셸에서 실행될 수있는 소스 파일에 대해서는 그렇지 않습니다. 따라서 dirname이라는 별칭을 실행할 수 dirname있지만 \dirname별칭 확장을 건너 뛰고라는 함수 또는 명령을 실행합니다 dirname. (단, 백 슬래시뿐만 아니라 인용도 가능합니다.)


답변