Executando um script bash a partir de um shell zsh

11

Estou tendo problemas para executar um script bash zsh. O script é semelhante ao abaixo e deve ser executado no bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

No entanto, meu shell está ativado por padrão zsh. Portanto, para executar o script acima, o que faço é digitar /bin/bashno zshprompt e, em seguida, eu o executo . script.sh.

No entanto, isso resulta em um erro e recebo:

zsh: no matches found: [0-9]+

(Eu deveria pegar 235234).

Neste ponto, estou confuso e tenho as seguintes perguntas:

  1. Se estou bash, por que recebo um erro relatado por zsh?
  2. Por que o egrepregexp falha? A expressão regular parece correta para mim.

Nota: Caso isso importe, não devo modificar o script (o script é compartilhado por vários usuários e não devemos fazer alterações nele).

obrigado

Amelio Vazquez-Reina
fonte

Respostas:

19

Se o script começar corretamente #!/bin/bash(você não pode ter outro comentário antes disso), basta executá-lo digitando /path/to/script.sh, sem isso .no começo. A .declaração é uma inclusão, significa "executar o conteúdo deste arquivo como se tivesse sido digitado aqui na linha de comando" (isso é chamado de "fornecimento" no jargão do shell unix).

A execução do bash e da fonte do script deve funcionar. Suponho que, como o bash foi iniciado automaticamente em algumas circunstâncias, mas você prefere o zsh, configurou o bash para mudar automaticamente para o zsh - talvez com o exec zshseu ~/.bashrc. Não faça isso: em vez disso, você deve passar para o zsh no arquivo que é executado quando você faz login, ou seja ~/.profile, e deixa em .bashrcpaz. Para zshser executado nos terminais, defina a SHELLvariável de ambiente:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

É lamentável que você não possa modificar o script, porque é um bug. Os colchetes devem ser citados, mesmo no bash. Se houver um arquivo chamado 3+no diretório atual, a chamada para egrepprocurará uma ou mais ocorrências do dígito, em 3vez de uma sequência de dígitos arbitrários. Se houver um arquivo chamado 3+e um arquivo chamado 4+, a chamada para egrepprocurará 3s no arquivo 4+. Aqui, a diferença entre bash e zsh só entra em jogo quando nenhum arquivo corresponde ao padrão fornecido: o bash silenciosamente executa o comando com o padrão não substituído, enquanto o zsh sinaliza um erro (por padrão).

Gilles 'SO- parar de ser mau'
fonte
Obrigado @Guilles. Isso foi muito útil. O estranho é que eu não tenho exec zshno meu ~/.bashrc, nem no meu ~/.profile(eu nem tenho um .profileno meu diretório pessoal). Não me lembro de como consegui criar zshmeu shell padrão. Além disso, desculpe-me pela confusão, mas a primeira linha do meu script é o shebang #!/bin/bash. Com isso, ainda não sei por que o fornecimento do arquivo zshnão funciona (se você tiver alguma idéia sobre isso, me avise). Nos dois casos, entrarei em contato com o administrador para atualizar o script e adicionar aspas à regexp.
Amelio Vazquez-Reina
O problema de fornecê-lo no zsh é o segundo argumento para egrep.
Ignacio Vazquez-Abrams