shopt -s dotglob
J'écris un script pour copier des fichiers, et j'essaie d'utiliser pour permettre à cp de copier des fichiers dot comme .jshint
et ainsi de suite.
Je peux exécuter shopt -s dotglob
directement à une invite bash sans erreur. Cependant, l'exécution du script génère l'erreur:
script.sh: 81: script.sh: shopt: not found
J'exécute ce script en shell bash, avec l'en-tête shebang #!/usr/bin/env bash
. Ligne d'erreur:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Vous ne trouvez rien d'utile sur Google, vous savez quel est le problème ici?
#!/bin/bash
tête plus simple ?shopt
est une commande intégrée bash,sh
n'a passhopt
, et le message d'erreur ressemble à un message d'erreur dedash
. Il est donc très probable que l'erreur ici exécute un script bash avecsh
(qui,dash
par défaut, dans Ubuntu ). Même s'ilsh
s'agit d'un lien symbolique versbash
, exécuter un script bash avecsh
n'est pas la même chose que l'exécuter avecbash
.Réponses:
Pour former une réponse à partir des commentaires:
Beaucoup de gens par habitude exécutent leurs scripts avec
sh
au lieu debash
. C'est une bonne pratique si la portabilité est un problème, mais beaucoup de gens le font parce qu'ils copient quelque chose qu'ils ont vu sans le comprendre.À moins que votre script ne doive s'exécuter sur un système Linux autre que le bureau (par exemple, exécuter des scripts shell sur des appareils Android est assez différent), je recommande d'utiliser la ligne Bash shebang au début:
Cette ligne, lorsqu'elle est la première ligne du script, détermine quel interpréteur (shell tel que bash ou sh, Python, etc.) est appelé pour l'exécuter. Si vous utilisez la ligne ci-dessus, vous obtiendrez (presque) le même comportement que vous le faites à partir de la ligne de commande, en supposant que vous utilisez le shell par défaut. Si, pour des raisons de portabilité ou de préférence, vous utilisez une ligne de shebang différente, sachez que vous devrez consulter la documentation du shell que vous avez référencé, même si le shell que vous référencez est un lien symbolique vers Bash.
la source
#!/usr/bin/env bash
comme c'est le travail d'env de savoir quel bash utiliser (au cas où vous l'auriez corrigé, par exemple).Vous devez quitter zsh et activer bash comme indiqué:
L'exécuter la commande
Après quoi, vous pouvez réactif zsh:
J'espère que cela pourra aider
la source
~/.basrc
est exécuté par bash au démarrage dans ce cas, donc il n'est pas nécessaire de l'appeler explicitement, 3) où la commande de l'OP est-elle exécutée? et 4) l'utilisation deexec
deux fois vous fait perdre tous les changements d'environnement que vous avez effectués dans le shell zsh initial, ce qui ne se produirait pas si vous appeliez simplement bash.