Exécuter un script bash à partir d'un shell zsh

11

J'ai des problèmes pour exécuter un script bash zsh. Le script est similaire à celui ci-dessous et est censé s'exécuter sous bash:

#!/bin/bash
echo "<235234>"  | egrep -oe [0-9]+

Cependant, mon shell est activé par défaut zsh, donc pour exécuter le script ci-dessus, je tape /bin/bashà l' zshinvite, puis je lance . script.sh.

Cependant, cela entraîne une erreur et j'obtiens:

zsh: no matches found: [0-9]+

(Je devrais y aller à la 235234place).

À ce stade, je suis confus et j'ai les questions suivantes:

  1. Si j'y suis bash, pourquoi est-ce que je reçois une erreur signalée par zsh?
  2. Pourquoi la egrepregexp échoue? L'expression régulière me semble correcte.

Remarque: Au cas où cela importe, je ne suis pas censé modifier le script (le script est partagé par plusieurs utilisateurs et nous ne sommes pas censés y apporter des modifications).

Merci

Amelio Vazquez-Reina
la source

Réponses:

19

Si le script commence correctement par #!/bin/bash(vous ne pouvez pas avoir d'autre commentaire avant cela), vous devez simplement l'exécuter en tapant /path/to/script.sh, sans cela .au début. C'est .une instruction include, cela signifie «exécuter le contenu de ce fichier comme s'il avait été tapé ici sur la ligne de commande» (c'est ce qu'on appelle «sourcing» dans le jargon du shell unix).

L'exécution de bash et l'approvisionnement du script devraient fonctionner. Je suppose que parce que vous avez démarré automatiquement bash dans certaines circonstances, mais vous préférez zsh, vous avez configuré bash pour basculer automatiquement vers zsh - peut-être avec exec zshdans votre ~/.bashrc. Ne faites pas cela: au lieu de cela, vous devez basculer vers zsh dans le fichier qui est exécuté lorsque vous vous connectez, c'est-à-dire ~/.profileet laisser .bashrcseul. Pour avoir zshété exécuté dans des terminaux, définissez la SHELLvariable d'environnement:

# in ~/.profile
export SHELL=/bin/zsh
if [ -t 1 ]; then exec $SHELL; fi

Il est regrettable que vous ne puissiez pas modifier le script, car il est bogué. Les crochets doivent être cités, même en bash. S'il y a un fichier appelé 3+dans le répertoire courant, l'appel à egreprecherchera une ou plusieurs occurrences du chiffre 3au lieu d'une séquence de chiffres arbitraires. S'il y a un fichier appelé 3+et un fichier appelé 4+, l'appel à egreprecherchera 3s dans le fichier 4+. Ici, la différence entre bash et zsh n'entre en jeu que si aucun fichier ne correspond au modèle fourni: bash exécute silencieusement la commande avec le modèle non substitué, tandis que zsh signale une erreur (par défaut).

Gilles 'SO- arrête d'être méchant'
la source
Merci @Guilles. Ce fut très utile. La chose étrange est que je n'en ai pas exec zshsur mon ~/.bashrc, ni sur mon ~/.profile(je n'en ai même pas .profilesur mon répertoire personnel). Je ne me souviens pas comment j'ai réussi à créer zshmon shell par défaut. Aussi, désolé pour la confusion, mais la première ligne de mon script est le shebang #!/bin/bash. Avec cela, je ne sais toujours pas pourquoi l'approvisionnement du fichier zshne fonctionne pas (si vous avez des idées à ce sujet, faites-le moi savoir). Dans les deux cas, je contacterai l'administrateur pour mettre à jour le script pour ajouter des guillemets à l'expression rationnelle.
Amelio Vazquez-Reina
Le problème avec son approvisionnement en zsh est le deuxième argument de egrep.
Ignacio Vazquez-Abrams