2009-03-07 6 views
2

je reçois erreur "command not found" sous Mac par la commande suivanteproblème avec command_not_found_handle Bash()

md5sum *.java | uniq -d -w32 

La raison est que Mac ne possède pas l'option -w par défaut.

Je voudrais faire Bash pour faire ce qui suit lorsque l'erreur se produit

  1. mis g au début de la première commande
  2. mis g au début d'une commande qui est après |

Comment pouvez-vous rendre l'erreur plus utile?

[modifier]

Problème: si Mac ne possède pas la fonction, je veux utiliser les fonctionnalités de coreutils. Par conséquent, le g devant les commandes de Mac.

+0

Que voulez-vous dire par « ne pas -w option par défaut " –

+0

Vous devez installer coreutils pour obtenir les commandes Unix. Ensuite, vous pouvez exécuter les commandes de GNU en plaçant g devant les commandes de Mac. –

+0

Est-ce que ça va aller juste de mettre 'g' avant même de courir? –

Répondre

3

Vous ne pouvez pas utiliser command_not_found_handle() parce que les commandes ne existe; ils retournent juste une erreur ($? != 0) en raison de paramètres non reconnus.

Dans ce genre de situations, vous devez contrôler explicitement les commandes émises avec un prologue spécifique à la plateforme au début du script, ce qui rend le nombre minimum d'hypothèses sur les paramètres, par exemple:

# defaults - satisfies most platforms 
MD5SUM=md5sum 
UNIQ=uniq 
# per-platform exceptions 
if [ "$OS" == "MacOS" ] ; then 
    # use GNU variants by prefixing with g 
    MD5SUM="g $MD5SUM" # or use the native program, MD5SUM=md5 
    UNIQ="g $UNIQ"  # or use the native program, UNIQ=uniq 
elif [ "$OS" == "SomeOtherOS" ] ; then 
    MD5SUM=md5hash # e.g. this platform computes MD5 sums with md5hash 
fi 
... 
# optionally cross-check for GNU variants on all platforms 
# does uniq support -w32? (no error on dry run?) if so, use it! 
$UNIQ -w32 /dev/null 2>/dev/null && UNIQ="$UNIQ -w32" 
# optionally perform one last validation before proceeding 
die() { echo "FATAL: $*" >&2 ; exit $1 ; } 
$UNIQ /dev/null >/dev/null || die $? "uniq is missing or failing: $UNIQ" 
$MD5SUM /dev/null >/dev/null || die $? "md5sum is missing or failing: $MD5SUM" 
... 
$MD5SUM *.java | $UNIQ -d 

MISE à JOUR

Notez qu'il est aussi une bonne pratique, surtout si votre script fonctionnera comme root, à pas - vous voudriez spécifier les emplacements entièrement qualifiés pour des programmes tels que uniq ou md5 ou md5sum ci-dessus, par exemple. UNIQ=/bin/uniq, MD5SUM=/sbin/md5sum, etc.)


MAJ2

Pour préfixer automatiquement un tas de commandes avec "g":

eval `for command in uniq md5sum grep sed ; do 
    echo \`echo \$command | tr '[a-z]' '[A-Z]'\`=\"g \$command\" 
done` 
+0

Il semble que j'ai écrit le code ci-dessus pour chaque commande Unix. Quelle est la manière rapide de faire cela? –

+0

vous ne devez pas faire cela pour chaque commande, seulement pour les problèmes. Mais si vous devez vraiment: eval 'pour la commande dans uniq md5sum grep sed; fais echo \ 'echo \ $ commande | tr '[a-z]' '[A-Z]' \ '= \" g \ $ commande \ "; fait – vladr

0

Sous Mac OS X fonctionne:

/sbin/md5 * .java | uniq -d

Pour gnu uniq voir:

http://rudix.org/#coreutils

+0

Et l'option -w32 pour uniq n'est pas nécessaire, car le macos md5 utilise un format de sortie différent du "vrai" md5sum. :-) –