Ich verwende eine Befehlszeilenanwendung, die im Wesentlichen eine Sammlung von Bash-Shell-Skripten ist. Die Anwendung wurde für die Ausführung unter BSD / OSX und auch unter Linux geschrieben. Eines der Skripte basiert auf awk. Es enthält zwei awk-Befehle: einen für nawk (die Standard-BSD-awk-Implementierung) und einen für gawk (die GNU-awk-Implementierung).
Die beiden fraglichen awk-Befehle sind nicht mit den verschiedenen Umgebungen kompatibel. Insbesondere der Befehl nawk schlägt fehl, wenn er mit gawk ausgeführt wird. Das Skript überprüft den Kernelnamen (dh uname -s
), um die Hostumgebung zu bestimmen, und führt dann den entsprechenden Befehl awk aus. Ich arbeite jedoch lieber unter Mac OS X mit den installierten GNU-Kerndienstprogrammen, sodass das Skript nicht ordnungsgemäß ausgeführt wird.
Während ich darüber nachdachte, wie dieser Fehler am besten behoben werden kann, kam mir der Gedanke, dass es schön wäre zu wissen, wie man programmgesteuert zwischen verschiedenen Varianten der gängigen Befehlszeilenprogramme unterscheidet, vorzugsweise auf relativ robuste und tragbare Weise.
Ich habe festgestellt, dass nawk das Flag '-V' zum Drucken der Versionsinformationen nicht akzeptiert. Daher habe ich mir gedacht, dass so etwas wie das Folgende funktionieren sollte:
awk -V &>/dev/null && echo gawk || echo nawk
Eine andere Variante könnte sein:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Dies scheint in meinen beiden Testumgebungen (OS X und CentOS) zu funktionieren. Hier sind meine Fragen:
- Ist das der beste Weg?
- Gibt es eine Möglichkeit, dies zu erweitern, um andere Variationen von awk (z. B. mawk, jawk usw.) zu handhaben?
- Lohnt es sich überhaupt, sich Gedanken über andere Versionen von awk zu machen?
Ich sollte auch erwähnen, dass ich sehr wenig über awk weiß.
quelle
awk -Wv
anstelle der Host-Umgebung sehenawk
verwendet wird, und stattdessen Code gemäß der POSIX-Spezifikation zu verwenden.Antworten:
Alternativ ist test is awk eine symbolische Verbindung:
quelle
Versuchen Sie es mit dem
which
Befehl und verwenden Sie den Exit-Code.Formatieren Sie dann Ihr Skript, um die Variable als Befehl zu verwenden
würde gelesen werden als
wenn
which
nawk findet. Sonst würde es verwendengawk
quelle
command
ist ein bash builtin Sie einen anderen Namen für die Variable verwenden möchten, und Sie können auch die unglaublich detaillierte Antwort auf die Frage , warum für viele Muscheln dort sehen möchten , bessere Alternativen sindwhich
bei unix.stackexchange.com/a/85250/109842GNU Awk wird häufig als
gawk
,awk
als Symlink dazu auf Systemen installiert , auf denen GNU die Standardeinstellung ist. Ich würde vermuten, dass dies auf BSD- und OS X-Systemen der Fall ist, da sie bereits ihre eigenen habenawk
.quelle
Ein dreckiger Hack
nawk-only-function()
gibt es nur aufnawk
quelle
Ich würde wahrscheinlich versuchen, das Makro AC_PROG_AWK m4 in autoconf zu missbrauchen, um eines auszuwählen und es entsprechend zu ordnen. Es ist wahrscheinlich übertrieben
quelle