왜이 쉘 스크립트에 백 슬래시가 포함됩니까?


21

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. 나는 그것이 필요하다고 생각하지 않습니다. 이 백 슬래시 사용은 소스 파일의 다른 위치에도 나타납니다. 내가 누락 된 이유는 무엇입니까?


답변:


30

백 슬래시는 별칭 확장을 억제합니다. 즉, 원래 명령을 실행하고 별칭 버전이 실행되지 않도록합니다. 시스템이 설정 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대신 사용해야 합니다). 대신 별칭과 같은 이름을 가진 함수를 우회하기 때문에 이것을 선호합니다.


1
또한 주목할 가치가 있으며 unalias -a, 이는 모든 별칭을 제거합니다.
Centimane

19
@Centimane 네. 그러나 \unalias -a별칭 확장을 억제 하기 위해해야합니다
Ben C

sysadmin도 작성할 수 /usr/bin/dirname있습니까?
RonJohn

@ RonJohn 예,이 특별한 경우에 가질 수 있습니다. 그러나 일부 프로그램의 경우 다른 배포판에서 다른 디렉토리에 배치합니다. 염두에 두는 인스턴스는 /bin/edUbuntu와 /usr/bin/edCentOS입니다. 전체 경로를 설정하면 스크립트의 이식성이 떨어집니다.
doneal

@ doneal24 가명 (alias)이 보이지 않기 DIRNAME=$(which dirname)때문에 와 같은 which것은 어떻습니까?
RonJohn

20

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


5
또는 command dirname.
Kusalananda

7
( \command dirname누군가가 별명을 만든 경우를 대비하여 command) : |
muru

별칭을 무시하는 이유는 무엇입니까? 이 기능이 특별한 경우입니까, 아니면 bash (예 : 핵)으로 하드 코딩되어야합니까?
extremeaxe5

@ extremeaxe5 bash는 단어의 일부가 인용되면 별칭 확장을 수행하지 않습니다.
muru

1
@ extremeaxe5 왜 기능이 존재하는지 묻는다면 모르겠습니다. 그것은에 POSIX 표준 그러나 "명령 이름 단어 [...] 그것이 여부를 확인하기 위해 조사해야한다 인용 부호가없는 유효한 별칭 이름"
muru가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.