저는 Solaris 시스템에서 bash
호출될 스크립트를 가지고 있습니다. /bin/sh
스크립트를 실행하면 /bin/sh ./solarisSh
작동합니다. 동일한 스크립트를 얻으면 실패합니다.
bash
Bourne Shell과 거의 유사하지 않다는 것을 알고 있습니다 . 이것은 내 문제가 아닙니다.
내 질문은: /bin/sh
파일을 가져올 때와 단순히 실행할 때 Solaris가 왜 그렇게 다르게 동작합니까?
여기에 데이터가 있습니다 ...
ns2 ~/tmp 560> env -i /bin/sh -x
$ uname -a
+ uname -a
SunOS ns2 5.7 Generic_106541-15 sun4m sparc SUNW,SPARCstation-10
$ cat ./solarisSh
+ cat ./solarisSh
[ ! "$BASH" ] && {
>&2 echo "ERROR: $0 is a Bash script. Exiting."
return 1 2> /dev/null || exit 1
}
haveRootPriv() {
local idCmd=/usr/bin/id
local euid
local uid
[[ $OHM_OS == "SunOS" ]] && idCmd=/usr/xpg4/bin/id
if (( ( $( $idCmd -ru) == 0 ) || ( $( $idCmd -u) == 0 ) )); then
echo 1
return 0
fi
echo 0
return 1
}
$ /bin/sh -x ./solarisSh
+ /bin/sh -x ./solarisSh
+ [ ! ]
+ echo ERROR: ./solarisSh is a Bash script. Exiting.
ERROR: ./solarisSh is a Bash script. Exiting.
+ return 1
$ . ./solarisSh
+ . ./solarisSh
syntax error: `$' unexpected
$
이것오류: ./solarisSh는 Bash 스크립트입니다. 그만두다.파일을 받을 때 제가 기대하는 바는 다음과 같습니다. 내가 얻는 것은구문 오류: "$" 예기치 않음.
질문을 검토하려면: 파일을 검색할 때와 단순히 실행할 때 Solaris /bin/sh가 왜 그렇게 다르게 작동합니까?
두 번째 질문이 있는 것 같습니다(죄송합니다): -x
파일을 가져올 때 왜 작동하지 않나요?
감사해요.
-에릭
답변1
$(...)
명령 대체를 제거하면 5.10에서의 실패가 제거되었습니다. 이는 .
실행하기 전에 전체 파일을 구문 분석하고 지원되지 않는 구문에서 오류가 발생하는 효과를 보고 있음을 나타냅니다 . 반면에 스크립트는 한 줄씩 구문 분석되므로 구문 오류가 발견되기 전에 종료됩니다.
실험을 통해 다른 구문 오류를 삽입하고 동일한 동작을 볼 수 있습니다. .
즉, 일찍 실패하고 sh
잘못된 줄로 실행됩니다.
왜? 나는 모른다. 내가 찾을 수 있는 어디에도 구체적으로 문서화되어 있지 않은 것 같습니다. 매뉴얼 페이지에는 다음과 같이 나와 있습니다 .
.
. filename Read and execute commands from filename and return. The search path specified by PATH is used to find the direc- tory containing filename.
문서에는 <<word
"쉘 입력을 ...로 읽습니다."라고 나와 있습니다. 이는 아마도 간결한 구문 분석을 의미하지만 이에 대해 명시적인 내용은 어디에서도 볼 수 없습니다. 일반적으로 Bash가 두 경우 모두 그러하듯이 쉘 스크립트에서는 행별 구문 분석이 매우 일반적입니다.
파일을 가져올 때 -x가 작동하지 않는 이유는 무엇입니까?
명령이 실제로 실행되기 시작하면 작동합니다. 구문 분석 단계에서는 아무 것도 인쇄되지 않습니다.
이 특정 예에서는 ` ... `
-style 명령 대체를 사용하면 작동하지만 실제 스크립트는 더 복잡할 수 있습니다.