$ alias bb=hello
$ cat test.sh
#! /bin/bash
alias bb
echo "$bb"
$ ./test.sh
./test.sh: line 3: alias: bb: not found
하위 bash 프로세스가 상위 bash 프로세스에서 스크립트 별칭을 상속받지 않기 때문입니까?
$ source ./test.sh
alias bb='hello'
스크립트의 콘텐츠는 bash 프로세스에서 실행되므로 별칭이 존재합니다. 그러나 별칭은 확장되지 않습니다.
Bash 매뉴얼에 따르면
셸이 비대화형인 경우 Shopt를 사용하여 Expand_aliases 셸 옵션을 설정하지 않으면 별칭이 확장되지 않습니다.
그러나 가져오는 스크립트의 콘텐츠는 대화형 bash 프로세스에서 실행되는데 별칭이 확장되지 않는 이유는 무엇입니까?
감사해요.
답변1
스크립트를 실행하면
./test.sh
그런 다음 현재 대화형 셸 대신 자체 비대화형 셸에서 실행됩니다. 당신은해야합니다
. ./test.sh
이는 다음과 같습니다.
source ./test.sh
두 번째 예에서는.
바라보다소싱("." 또는 "source")과 bash에서 파일 실행의 차이점은 무엇입니까?
의 경우 echo "$bb"
매개변수 확장별칭을 확장하지 마십시오.:
별명간단한 명령의 첫 번째 단어로 사용될 때 단어를 문자열로 바꿀 수 있습니다.
답변2
쉘 스크립트는 서브쉘에서 실행됩니다(프롬프트를 인쇄하는 현재 프로세스가 아님).
셸 스크립트 실행을 예측 가능하게 만들기 위해 스크립트를 실행하기 전에 하위 셸에서 별칭이 지워집니다. 이런 일이 발생하지 않으면 스크립트는 알 수 없는 별칭을 해석하고 활성화된 별칭에 따라 모든 작업을 수행할 수 있습니다.
경고: 이는 스크립트를 얻는 경우 기본 쉘에 영향을 주지만 최소한 유전적 쉘( ksh
또는 같은 역사적인 Bourne Shell 소스에 의존하는 쉘 bosh
)은 스크립트 파일을 전체적으로 구문 분석합니다(모든 줄 바꿈이 숫자 대체로 구분된 것처럼). 소스 스크립트에서 코드를 실행하기 전에. 이로 인해 alias
소스 스크립트 내부의 정의가 소스 스크립트 자체에서 활성화되지 않습니다.