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

12

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

Posso executar shopt -s dotglob diretamente em um prompt bash sem erros. No entanto, a execução do script gera o erro:

script.sh: 81: script.sh: shopt: not found

Estou executando este script no bash shell, 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 encontrando nada de útil no google, alguma ideia do problema?

    
por Kurtosis 27.08.2012 / 08:16

1 resposta

20

Para formar uma resposta a partir dos comentários:

Muitas pessoas com hábitos usam seus scripts com sh em vez de bash . Essa é uma boa prática se a portabilidade for uma preocupação, mas muitas pessoas fazem isso porque estão copiando algo que viram sem compreendê-la.

A menos que seu script precise ser executado em um sistema Linux que não seja de área de trabalho (por exemplo, executar scripts de shell em dispositivos Android é bem diferente), recomendo usar a linha Bash shebang no começo:

#!/bin/bash

Esta linha, quando é a primeira linha no script, determina qual interpretador (shell como bash ou sh, Python, etc.) é chamado para executá-lo. Se você usar a linha acima, você obterá o mesmo comportamento (quase) da linha de comando, assumindo que você usa o shell padrão. Se por razões de portabilidade ou preferência você usar uma linha shebang diferente, esteja ciente de que você terá que consultar a documentação para o shell que você referenciou, mesmo se o shell que você referencia é um link simbólico para Bash.

    
por Scott Severance 28.08.2012 / 03:03

Tags