대화형 bash 프로세스에서 얻은 스크립트의 별칭이 확장되지 않는 이유는 무엇입니까?

대화형 bash 프로세스에서 얻은 스크립트의 별칭이 확장되지 않는 이유는 무엇입니까?
$ 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소스 스크립트 내부의 정의가 소스 스크립트 자체에서 활성화되지 않습니다.

관련 정보