내 스크립트 사본에는 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
. 나는 그것이 필요하다고 생각하지 않습니다. 이러한 백슬래시 사용은 소스 파일의 다른 곳에서도 발생합니다. 내가 이렇게 할 이유가 없나요?
답변1
백슬래시는 별칭 확장을 억제합니다. 즉, 원래 명령을 실행하고 별칭 버전이 실행되지 않도록 합니다. 시스템 설정 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
). 나는 이 방법이 별칭은 물론 동일한 이름을 가진 함수도 우회하기 때문에 선호합니다.
답변2
conda.sh
가져오려는 파일인 경우 백슬래시를 사용하여 별칭을 우회합니다 . Bash는 일반적으로 스크립트 실행을 위해 별칭 확장을 비활성화하지만 대화형 셸에서 실행될 수 있는 소스 파일의 경우에는 그렇지 않습니다. 따라서 dirname
이름이 지정된 별칭은 실행될 수 있지만 dirname
별칭 \dirname
확장은 건너뛰고 이름이 지정된 함수나 명령이 실행됩니다 dirname
. (역슬래시뿐만 아니라 어떤 인용문이라도 가능합니다.)