Executando um script bash de um shell zsh

7

Estou com problemas para executar um script bash em zsh . O script é semelhante ao abaixo e deve ser executado sob bash:

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

No entanto, meu shell é, por padrão, zsh , portanto, para executar o script acima, digito /bin/bash no meu prompt zsh e, em seguida, corro . script.sh .

No entanto, isso resulta em um erro e eu recebo:

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

(eu deveria ter 235234 ).

Neste ponto, estou confuso e tenho as seguintes perguntas:

  1. Se eu estiver em bash , por que recebo um erro relatado por zsh ?
  2. Por que o egrep regexp falha? A expressão regular parece correta para mim.

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

Obrigado

    
por Amelio Vazquez-Reina 30.09.2011 / 00:31

1 resposta

16

Se o script começar corretamente com #!/bin/bash (você não pode ter outro comentário antes disso), você deve simplesmente executá-lo digitando /path/to/script.sh , sem que . no início. O . é uma instrução include, significa “executar o conteúdo deste arquivo como se tivesse sido digitado aqui na linha de comando” (isso é chamado de “sourcing” no jargão do shell unix).

A execução do bash e o fornecimento do script devem funcionar. Eu estou supondo que porque você tinha o bash iniciado automaticamente em algumas circunstâncias, mas você prefere o zsh, você configurou o bash para alternar automaticamente para o zsh - talvez com exec zsh no seu ~/.bashrc . Não faça isso: em vez disso, você deve alternar para zsh no arquivo executado ao efetuar login, ou seja, ~/.profile e deixar .bashrc sozinho. Para que zsh seja executado nos terminais, defina a variável de ambiente SHELL :

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

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

    
por 30.09.2011 / 00:57

Tags