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`
Que voulez-vous dire par « ne pas -w option par défaut " –
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. –
Est-ce que ça va aller juste de mettre 'g' avant même de courir? –