Votre utilisation des parenthèses et de l'alternance est une construction spécifique à zsh. Il ne fonctionne pas dans les autres shells, y compris zsh en mode de compatibilité sh. Si vous voulez continuer à utiliser cette construction, vous devrez appeler zsh comme zsh (probablement en remplaçant #!/bin/sh
par #!/bin/zsh
ou quelque chose comme ça).
Si vous avez besoin de votre script à exécuter sur ksh, utilisez #!/bin/ksh
ou #!/usr/bin/env ksh
et
cp /somedire/*[email protected](txt|xml|xsd) /destination/dir/
Si vous devez également soutenir bash, cette même commande avec le @
fonctionnera à condition que vous exécutez les commandes suivantes en premier:
shopt -s extglob 2>/dev/null ## tell bash to parse ksh globbing extensions
setopt ksh_glob 2>/dev/null ## tell zsh to parse ksh globbing extensions
Si vous avez besoin de la compatibilité POSIX, vous devrez utiliser trois commandes séparées, et se préparer à un message d'erreur si l'une des trois extensions n'a pas de correspondance. Une solution plus robuste utiliserait trouver:
find /somedire -name /somedire -o -type d -prune -o \
\(-name '*.txt' -o -name '*.xml' -o '*.xsd' \) \
-exec sh -c 'cp "[email protected]" "$0"' /destination/dir {} +
Le script est-il également exécuté par zsh? – ngroot
la commande est bien exécutée dans zsh. mais dans le script shell il crèche – Nayn