Sie nicht command_not_found_handle()
verwenden können, da die Befehle existieren; Sie geben nur einen Fehler ($? != 0
) wegen nicht erkannter Parameter zurück.
In diesen Arten von Situationen, die Sie explizit die Befehle mit eine plattformspezifische Prolog gleich am Anfang des Skripts ausgegeben Kontrolle sollten, die minimale Anzahl von Annahmen über Parameter zu machen, zum Beispiel:
# 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
UPDATE
Beachten sie, dass es auch eine gute Praxis ist, vor allem, wenn Ihr Skript als root
ausgeführt wird, auf nicht verlassen auf $PATH
- Sie würden die voll qualifizierten Standorte für Programme wie uniq
oder md5
oder md5sum
oben, z. UNIQ=/bin/uniq
, MD5SUM=/sbin/md5sum
etc.)
UPDATE2
automatisch, um eine Reihe von Befehlen mit "g" prefix:
eval `for command in uniq md5sum grep sed ; do
echo \`echo \$command | tr '[a-z]' '[A-Z]'\`=\"g \$command\"
done`
was meinst du mit „nicht über -w Option standardmäßig " –
Sie müssen Coreutils installieren, um Unix-Befehle zu erhalten. Dann können Sie GNUs Commands ausführen, indem Sie g vor die Befehle eines Mac stellen. –
Wird es in Ordnung sein, "g" vor dem ersten Lauf zu setzen? –