"bash <file>"이 작동하면 "source <file>"에 오류가 발생하는 이유는 무엇입니까?


26

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

#!/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
아니요, 이것은 전체 코드입니다. 줄 바꿈은 0a입니다.
knezi

2
@Rahul 유닉스 줄 바꿈 문자의 16 진수 코드
PSkocik

2
는 IS $BASH_ENV세트는?
roaima

2
@PSkocik 정말 이상합니다. bash -c "source / tmp / test"가 작동합니다.
knezi 2016 년

5
아하! bash -c귀하의 질문에 적용되도록 추가 하십시오. 그런 다음 ~/.bashrc파일 의 내용을 보여주십시오. 아마도 문제가 될 수 있습니다.
terdon

답변:


75

별명을 지정하면 행동을 재현 할 수 있습니다 fi.

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

비 대화식 쉘 (쉘 스크립트를 실행하는 쉘 유형)에서 별명을 사용할 수 없으므로이를 실행할 때 작동하지만 소스에서 실패하면 실패합니다. bash 매뉴얼에 설명 된대로 :

expand_aliases쉘 옵션을 사용하여 설정 하지 않으면 쉘이 대화식이 아닌 경우 별명이 확장되지 않습니다 shopt( Shopt Builtin 참조 ).

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


16
당신은 완전히 옳습니다. 다음을 설정했습니다 : alias fi = 'find -type f | xargs grep -H '.
knezi

7
alias지금 제거하십시오 ! :)
Mark Stewart

9
나는 아무도 모호한 문제를 알아낼 수 있었다는 것에 놀랐습니다. 잘하셨습니다.
MathematicalOrchid

6
@MathematicalOrchid 나는 (대화 형 쉘로 인해) 별칭이 있다고 의심 set하고 출력에 의해 배제되었으며 alias if='foo "'(열린 인용 따옴표는 누락 된 따옴표에 대해 오류를 fi
일으켰
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.