Sto usando un'applicazione a riga di comando che è essenzialmente una raccolta di script shell bash. L'applicazione è stata scritta per essere eseguita su BSD / OSX e anche su Linux. Uno degli script si basa su awk. Contiene due comandi awk: uno scritto per nawk (l'implementazione standard di BSD awk) e uno scritto per gawk (l'implementazione di GNU awk).
I due comandi awk in questione non sono compatibili con i diversi ambienti; in particolare il comando nawk ha esito negativo quando eseguito con gawk. Lo script controlla il nome del kernel (cioè uname -s
) per determinare l'ambiente host, quindi esegue il comando awk appropriato. Comunque preferisco lavorare su Mac OS X con le utility GNU core installate, quindi lo script non funziona correttamente.
Nel processo di riflessione sul modo migliore per correggere questo bug, mi è venuto in mente che sarebbe bello sapere come distinguere programmaticamente tra i diversi gusti delle comuni utility da riga di comando, preferibilmente in modo relativamente robusto e portatile.
Ho notato che nawk non accetta il flag '-V' per stampare le informazioni sulla versione, quindi ho pensato che qualcosa di simile al seguente dovrebbe funzionare:
awk -V &>/dev/null && echo gawk || echo nawk
Un'altra variante potrebbe essere:
awk -Wversion &>/dev/null && echo gawk || echo nawk
Questo sembra funzionare sui miei due ambienti di test (OS X e CentOS). Ecco le mie domande:
- È questo il modo migliore di andare?
- C'è un modo per estenderlo per gestire altre varianti di awk (ad esempio mawk, jawk, ecc.)?
- Vale anche la pena preoccuparsi di altre versioni di awk?
Dovrei anche menzionare che so molto poco di Awk.
awk -Wv
anziché l'ambiente host
awk
viene utilizzata e codificare invece la specifica POSIX .