"세게 때렸다"면"효과가 있는 것과 그 이유" 출처"오류가 났나요?

"세게 때렸다"면"효과가 있는 것과 그 이유" 출처"오류가 났나요?

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

#!/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 -p다음과 같습니다 set -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별칭이 인식되어 소스를 깨뜨립니다.

관련 정보