Je peux exécuter cette commande à partir de mon invite de ligne de commande:
cp -r folder/!(exclude-me) ./
Pour copier récursivement tout le contenu de l' folder
exception du sous-répertoire nommé exclude-me
dans le répertoire courant. Cela fonctionne exactement comme prévu. Cependant, j'ai besoin de cela pour travailler dans un script bash que j'ai écrit, où j'ai ceci:
if [ -d "folder" ]; then
cp -r folder/!(exclude-me) ./
rm -rf folder
fi
Mais quand j'exécute le script:
bash my-script.sh
J'ai compris:
my-script.sh: line 30: syntax error near unexpected token `('
my-script.sh: line 30: ` cp -r folder/!(exclude-me) ./'
Et je ne sais pas pourquoi cela fonctionne à partir de l'invite de commande, mais la même ligne exacte ne fonctionne pas dans un script bash.
la source
env > file1
dans le script et de l'exécuter./it
, puisenv > file2
etsource it
, dans l'espoir que j'aurais trouvé une différence dans leenv
s, ce qui n'est pas le cas. Comment puis-je lister par programme toute la différence entre deux shells (dans ce cas interactif vs non interactif)?Ajoutez cette ligne en haut de votre script:
!(...)
est une fonction de correspondance de motifs étendue, vous devezextglob
activer l'option pour l'utiliser. Voir shopt builtin pour plus de détails.la source