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ß.
awk -Wv
anstelle der Host-Umgebung sehen
awk
verwendet wird, und stattdessen Code gemäß der POSIX-Spezifikation zu verwenden.