다음 스크립트가 있습니다.
#!/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
별칭이 인식되어 소스를 깨뜨립니다.