Quando o shell padrão não é bash-compatível, por que os scripts do bash não funcionam bem?

4

Meu shell padrão é peixe, porque é muito melhor. Mas muitas vezes quando executo scripts, recebo erros que parecem ser do script bash sendo processados por fish. Eu acho que isso é porque o roteirista assumiu que o shell padrão é bash, mas eu não entendo o mecanismo.

Por exemplo, o script install.sh do CrashPlan começa com uma apresentação:

~/CrashPlan-install> head install.sh
#!/bin/bash

#############################################################
# Linux Client Installer Script
#############################################################

Então, quando eu executo ./install.sh , ele deve ser processado pelo bash, certo? O shell do terminal padrão deve ser irrelevante. No entanto, quando meu shell padrão é fish, a execução de scripts como esse faz com que fish retorne erros, como se estivesse processando o script:

fish: Expected a command name, got token of type “Run job in background”. Did you mean
 “COMMAND; and COMMAND”? See the help section for the “and” builtin command by typing “help and”.
Standard input: sed -imod "s|Exec=.*|Exec=/usr/local/crashplan/bin/CrashPlanDesktop|" 
 /home/username/Desktop/CrashPlan.desktop && rm -rf /home/username/Desktop/CrashPlan.desktopmod 

É por causa de uma configuração incorreta do meu computador ou porque o script foi escrito de maneira não portátil?

    
por endolith 16.11.2012 / 18:17

1 resposta

5

So when I run ./install.sh it should be processed by bash, right?

De fato. É exatamente para isso que serve a shebang.

Resolução de problemas

  • Salve o seguinte como test.sh e tente executá-lo em peixes.

    #!/bin/bash
    
    true && true
    

    Funciona no meu computador e no seu.

  • Verifique se a primeira linha de install.sh contém apenas os caracteres #!/bin/bash .

    Caracteres invisíveis (como um quebra de linha CR) podem confundir peixe.

  • Executar

    /bin/bash --version
    

    para verificar se o bash é realmente bash e não foi acidentalmente substituído / modificado ao longo do tempo.

install.sh

$SRC_USER é apenas um sinônimo criado pelo script para $SUDO_USER .

Como resultado, quando o script é executado com privilégios de root, o comando

su ${SRC_USER} -c "sed -imod \"s|Exec=.*|Exec=${GUISCRIPT}|\" ${DESKTOP_LAUNCHER} && rm -rf ${DESKTOP_LAUNCHER}mod"

usa automaticamente o shell padrão do usuário do sudo, que é fish.

Para substituir esse padrão, adicione a instrução -s /bin/bash ao comando su .

    
por 16.11.2012 / 19:28