shopt funciona na linha de comando, não encontrado quando executado em um script

13

Estou escrevendo um script para copiar alguns arquivos e tentando usar shopt -s dotglob para permitir que o cp copie arquivos de ponto como .jshinte outros enfeites.

Eu posso executar shopt -s dotglobdiretamente 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?

Kurtosis
fonte
Obrigado pelo lembrete, respostas selecionadas por tudo o que pude. Ainda uma questão além desta pergunta que ainda não tem uma boa resposta.
Kurtosis 27/08/12
3
Tente com o #!/bin/bashcabeçalho mais simples ?
Ish
E qual versão do Ubuntu?
Ish
2
@izx, essa é a resposta certa, shopté um bash embutido, shnão possui shopt, e a mensagem de erro parece uma mensagem de erro de dash. Então, provavelmente, o erro aqui está executando um script bash sh(que no Ubuntu é dashpor padrão). Mesmo que shseja um link simbólico bash, executar um script bash shnão é o mesmo que executá-lo bash.
Geirha

Respostas:

22

Para formar uma resposta a partir dos comentários:

Muitas pessoas sem hábito executam seus scripts em shvez de bash. 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:

#!/bin/bash

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.

Scott Severance
fonte
5
Para ser completamente inter-sistema, eu prefiro: #!/usr/bin/env bash como é o trabalho do env saber qual bash usar (caso você o tenha corrigido, por exemplo).
shrikeh
-1

Você precisa sair do zsh e ativar o bash, como mostrado:

exec bash

O executar o comando

source ~/.bashrc

Após o qual você pode reativar o zsh:

exec zsh

espero que ajude

David Kabii
fonte
Hummm. 1) Eu não acho que o OP estava usando zsh, 2) O AFAIK ~/.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 uso execduas 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.
Xenoid 29/10/19
No meu caso, foi necessário captar as alterações do ambiente e as alterações persistiram. Acabei de reiniciar o computador e todas as minhas alterações persistem. Talvez seja apenas específico para anaconda que eu estava tentando configurar embora
David Kabii