Solaris / bin / sh O fornecimento de um arquivo se comporta de maneira diferente da execução de um arquivo. Por quê?

2

Eu tenho um script bash que será chamado por /bin/sh em uma máquina Solaris. Quando executo o script como /bin/sh ./solarisSh , funciona. Quando eu obtenho o mesmo script, ele falha.

Eu sei que bash e Bourne Shell são quase nada semelhantes. Esta não é a minha pergunta.

A minha pergunta é: Por que o Solaris /bin/sh se comporta de maneira tão diferente ao fazer o sourcing de um arquivo versus simplesmente executar um arquivo?

Aqui estão os dados ...

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
$ 

O ERROR: ./solarisSh é um script de Bash. A saída. é o que eu esperava quando obtive o arquivo. O que recebi foi o erro de sintaxe: '$' inesperado .

Para recapitular a pergunta: Por que o Solaris / bin / sh se comporta de maneira tão diferente ao fazer o sourcing de um arquivo versus simplesmente executar um arquivo?

Acho que tenho uma segunda pergunta também (desculpe): por que o -x não funciona ao fazer o sourcing de um arquivo?

Obrigado.
-Erik

    
por Erik Bennett 11.09.2017 / 05:01

1 resposta

4

A exclusão da substituição do comando $(...) remove a falha para mim no 5.10. Isso sugere que o que você está vendo é o efeito de . analisar todo o arquivo antes de ser executado e encontrar um erro nessa sintaxe não suportada. Por outro lado, o script está sendo analisado linha por linha, portanto, ele sai antes que o erro de sintaxe seja percebido.

Experimentalmente, você pode inserir outros erros de sintaxe e ver o mesmo comportamento: . falha no início e sh é executado na linha malformada.

Por quê? Eu não sei. Não parece ser especificamente documentado em qualquer lugar que eu possa encontrar. A página man apenas diz para . :

 . filename

     Read and execute commands from filename and return.  The
     search path specified by PATH is used to find the direc-
     tory containing filename.

A documentação de <<word diz que "entrada de shell é lida até ...", o que talvez implique uma análise minimalista, mas não vejo nada explícito em lugar algum. A análise de linha por linha é bastante comum para scripts de shell em geral, e é o que o Bash faz nos dois casos, por exemplo.

Why doesn't -x work when sourcing a file?

Ele funciona, desde que os comandos realmente iniciem a execução. Nada é impresso durante a fase de análise.

Para este exemplo específico, usar a substituição de comando ' ... ' -style funcionaria, mas o script real é provavelmente mais complexo.

    
por 11.09.2017 / 05:27