2009-03-07 22 views
2

ich durch den folgenden Befehl „Befehl nicht gefunden“ Fehler in Mac erhaltenProblem mit Bash command_not_found_handle()

md5sum *.java | uniq -d -w32 

Der Grund dafür ist, dass Mac nicht -w Option standardmäßig hat.

Ich mag Bash machen Folgendes zu tun, wenn der Fehler

  1. put g zu Beginn des ersten Befehls
  2. put g am Anfang eines Befehls auftritt, die nach ist |

Wie können Sie den Fehler nützlicher machen?

[Bearbeiten]

Problem: wenn Mac nicht die Funktion haben, möchte ich die Eigenschaften in coreutils verwenden. Daher das g vor Macs Befehlen.

+0

was meinst du mit „nicht über -w Option standardmäßig " –

+0

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. –

+0

Wird es in Ordnung sein, "g" vor dem ersten Lauf zu setzen? –

Antwort

3

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` 
+0

Es scheint, dass ich den obigen Code für jeden Unix-Befehl geschrieben habe. Was ist der schnelle Weg, das zu tun? –

+0

Sie müssen dies nicht für jeden Befehl tun, nur für die problematischen. Aber wenn Sie wirklich müssen: eval 'für Befehl in uniq md5sum grep sed; tue echo \ echo \ $ command | tr '[a-z]' '[A-Z]' \ '= \ "g \ $ befehl \"; fertig – vladr

0

Unter Mac OS X funktioniert:

/sbin/md5 * .java | uniq -d

Für Gnu uniq siehe:

http://rudix.org/#coreutils

+0

Und die Option -w32 für uniq wird auch nicht benötigt, weil das macs md5 ein anderes Ausgabeformat verwendet als das "echte" md5sum. :-) –