만약 "배쉬"가 작동하는데 왜 "소스"인가요?" 오류가 발생한다고요?

만약 "배쉬"가 작동하는데 왜 "소스"인가요?" 오류가 발생한다고요?

다음 스크립트가 있습니다.

#!/bin/bash
set -x
if :; then
    echo a
fi

을 실행하면 가 bash /tmp/file에코 a되지만 를 실행하면 source /tmp/file다음을 얻습니다.

bash: /tmp/test: line 6: syntax error: unexpected end of file

출력:

knezi@holly tmp]$set -x; source /tmp/test; set +x
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$set -x; command source /tmp/test; set +x
+ set -x
+ command source /tmp/test
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$bash -c "source /tmp/test"
+ bash -c 'source /tmp/test'
++ :
++ echo a
a


knezi@holly tmp]$od -c /tmp/test
0000000   #   !   /   b   i   n   /   b   a   s   h  \n   s   e   t    
0000020   -   x  \n   i   f       :   ;       t   h   e   n  \n  \t   e
0000040   c   h   o       a  \n   f   i  \n
0000051

명령 출력 shopt -pset -o:http://pastebin.com/bsqc8aru

출력 set:http://pastebin.com/S9KpqZAL

declare -fp아무것도 생산하지 않습니다.

나는 그것이 source와 동일하다고 생각했지만 bash새 세션을 시작하는 대신 현재 세션의 코드를 실행합니다. 누구든지 나에게 이 오류를 설명할 수 있나요?

저는 bash GNU bash 버전 4.2.53(1)-릴리스(x86_64-redhat-linux-gnu)를 실행합니다.

답변1

다음과 같이 별칭을 지정하면 귀하의 행동을 재현할 수 있습니다 fi.

$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file

실행할 때는 작동하지만 소싱할 때는 실패합니다. 비대화형 셸(셸 스크립트를 실행하는 셸 유형)에서는 별칭을 사용할 수 없기 때문입니다. 설명된 대로배쉬 매뉴얼:

expand_aliases셸 옵션을 사용하여 설정 하지 않는 한 셸이 대화형이 아닐 때 별칭은 확장되지 않습니다 shopt(참조).더 숍 빌트인).

그러나 source무언가를 실행하면 대화형이기 때문에 이미 별칭을 로드한 현재 셸에서 실행되므로 fi별칭이 인식되어 소싱이 중단됩니다.

관련 정보