2 votes

Comment utiliser un glob avec des parenthèses dans Zsh ?

Ceci :

cp ./hb_(lys|gln|thr|glu|ace|nhe)*_aacH*.ptraj ./

Fonctionne comme prévu lorsqu'il est exécuté dans le terminal. Cependant, mettre la même ligne dans un script exécutable ne fonctionne pas car je reçois un

syntax error near unexpected token `('\

J'ai essayé de m'échapper \ ne résout pas le problème. Pour bash, il semble qu'il y ait quelque chose à faire avec extglob mais je ne trouve pas de suggestions similaires pour zsh.

Toute aide est appréciée.

4voto

Marlon Richert Points 755

Cela n'a rien à voir avec les options de l'obus. Cela dépend plutôt de ce que shebang que vous avez dans votre fichier exécutable.

Lorsque vous exécutez un script en tant qu'exécutable (au lieu de source -ou en l'exécutant comme une fonction), il s'exécute dans un sous-shell séparé et non dans votre shell de niveau supérieur. Un sous-shell hérite de l'environnement de son parent (c'est-à-dire, export ), mais pas les options du shell. Au lieu de cela, le shebang dicte dans quel shell il s'exécute et avec quelles options.

Si le shebang est #!/bin/zsh il lancera un sous-shell Zsh avec les options par défaut, puis lira les commandes à partir de /etc/zshenv y $ZDOTDIR/.zshenv et ensuite à partir de votre script.

De même, si le shebang est #!/bin/bash votre script s'exécutera en fait dans Bash, et non dans Zsh.

Enfin, si le shebang est #!/bin/sh cela dépend de votre système d'exploitation. Sous MacOS, il existe un lien symbolique /private/var/select/sh qui pointe vers l'exécutable shell à utiliser lorsque le shebang est #!/bin/sh . (Type man 1 sh pour plus d'informations). Par défaut, cette coquille est Bash, et non Zsh, même si vous avez changé votre shell de connexion pour Zsh. La seule façon de le changer est de changer ce lien symbolique.

Mais même si vous faites /private/var/select/sh pointent vers l'exécutable Zsh, si vous exécutez votre script avec un #!/bin/sh shebang, Zsh ne fonctionnera pas en "mode natif". Au lieu de cela, il s'exécutera en sh mode d'émulation, qui permet de basculer entre un certain nombre d'options qui sont significativement différent des valeurs par défaut de Zsh .

Les parenthèses sont syntaxe de base des globules dans Zsh . Cependant, ils ne sont pas dans Bash. Donc, à mon avis, votre script est en fait exécuté dans Bash, à cause du shebang.


Donc, de toute façon, pour faire court : épargnez vous la peine et ne lancez pas votre script comme un exécutable. Plutôt, ce qui est généralement le plus pratique dans Zsh, c'est d'ajouter le répertoire parent de votre script à votre fichier $fpath et ensuite autoload votre script en fonction .

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X