Estou escrevendo um script para copiar alguns arquivos e tentando usar shopt -s dotglob
para permitir que o cp copie arquivos de ponto como .jshint
e outros enfeites.
Eu posso executar shopt -s dotglob
diretamente em um prompt do bash sem nenhum erro. No entanto, a execução do script gera o erro:
script.sh: 81: script.sh: shopt: not found
Estou executando esse script no shell bash, com o cabeçalho shebang #!/usr/bin/env bash
. Linha de erro:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Não encontrou nada útil no google, alguma ideia de qual é o problema aqui?
#!/bin/bash
cabeçalho mais simples ?shopt
é um bash embutido,sh
não possuishopt
, e a mensagem de erro parece uma mensagem de erro dedash
. Então, provavelmente, o erro aqui está executando um script bashsh
(que no Ubuntu édash
por padrão). Mesmo quesh
seja um link simbólicobash
, executar um script bashsh
não é o mesmo que executá-lobash
.Respostas:
Para formar uma resposta a partir dos comentários:
Muitas pessoas sem hábito executam seus scripts em
sh
vez debash
. Essa é uma boa prática se a portabilidade for uma preocupação, mas muitas pessoas o fazem porque estão copiando algo que viram sem entender.A menos que seu script precise executar em um sistema Linux não desktop (por exemplo, executar scripts shell em dispositivos Android é bem diferente), recomendo usar a linha shebang Bash no início:
Essa linha, quando é a primeira linha do script, determina qual intérprete (shell como bash ou sh, Python etc.) é chamado para executá-lo. Se você usar a linha acima, obterá o mesmo comportamento (quase) da linha de comando, supondo que você use o shell padrão. Se, por motivos de portabilidade ou preferência, você usar uma linha shebang diferente, lembre-se de que precisará consultar a documentação do shell que você referenciou, mesmo que o shell que você referenciar seja um link simbólico para o Bash.
fonte
#!/usr/bin/env bash
como é o trabalho do env saber qual bash usar (caso você o tenha corrigido, por exemplo).Você precisa sair do zsh e ativar o bash, como mostrado:
O executar o comando
Após o qual você pode reativar o zsh:
espero que ajude
fonte
~/.basrc
é executado pelo bash na inicialização neste caso, portanto, não há necessidade de chamá-lo explicitamente, 3) onde o comando do OP é executado? e 4) o usoexec
duas vezes faz com que você perca as alterações feitas no ambiente no shell zsh inicial, o que não aconteceria se você apenas chamasse bash.