Solaris /bin/sh는 파일을 가져올 때와 실행할 때 다르게 동작합니다. 왜?

Solaris /bin/sh는 파일을 가져올 때와 실행할 때 다르게 동작합니다. 왜?

저는 Solaris 시스템에서 bash호출될 스크립트를 가지고 있습니다. /bin/sh스크립트를 실행하면 /bin/sh ./solarisSh작동합니다. 동일한 스크립트를 얻으면 실패합니다.

bashBourne 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 명령 대체를 사용하면 작동하지만 실제 스크립트는 더 복잡할 수 있습니다.

관련 정보