In bash steht $0
der Name des Skripts, aber in awk, wenn ich ein Skript namens myscript.awk mit folgendem Inhalt erstelle:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
und starte es, es wird nur "awk" ausgegeben. Außerdem wird ARGV [i] mit i> 0 nur für Skriptargumente in der Befehlszeile verwendet. Wie kann man also den Namen des Skripts drucken lassen, in diesem Fall "myscript.awk"?
mawk
Ubuntu standardmäßig ist? Auf meinem 15.04 VM, die Standardeinstellungawk
istgawk
. Während mawk installiert ist, ist dies nicht die Standardeinstellung.awk -f myscript.awk
. Dies hat jedoch nichts mit dem fraglichen Problem zu tun.awk
Skript, weil es mit beginnt#!/usr/bin/awk -f
. Shell-Skripte beginnen mit#!/bin/sh
(oder ähnlichem).awk -f file
.Antworten:
Mit GNU awk 4.1.3 in Bash auf Cygwin:
Ich weiß nicht, wie portabel das ist. Wie immer würde ich ein awk-Skript nicht mit einem shebang in einem Shell-Skript ausführen, da es Sie nur der möglichen Funktionalität beraubt. Halte es einfach und tue dies stattdessen:
Letzteres funktioniert mit jedem modernen awk in jeder Shell auf jeder Plattform.
quelle
ENVIRON["_"]
funktioniert einwandfrei und ruft kein externes Programm auf. Die zweite Optionawk -v ...
hängt davon ab, wie das Skript ausgeführt wird. Ich will das nicht.tst.sh
ist irreführend. Es ist einawk
Skript, kein Shell-Skript.BEGIN
ist kein gültiger Shell-Befehl.ENVIRON["_"]
den Pfad des aufrufenden Shell-Skripts, wenn er von jeder awk gedruckt wird, die über einen shebang von jeder Shell aufgerufen wird." Ich würde niemals ein awk-Skript von einem shebang anrufen, mir persönlich ist die Antwort egal, aber ich dachte nur, ich würde es erwähnen ... Oh, ich sehe in den obigen Kommentaren, dass @cuonglm antwortete, dass es nur in einigen Shells unterstützt wird .*12345*/tmp/test.awk
.ARGV[0]
ist zuverlässig immerawk
in dash, bash, zsh und ksh93.Ich denke nicht, dass dies gemäß der
gawk
Dokumentation möglich ist :Auf können
linux
Sie versuchen, eine Art schmutzigen Hack zu verwenden, und wie in Kommentaren von Stéphane Chazelas gezeigt , ist es möglich, wenn die Implementierung vonawk
NUL-Bytes unterstützt:quelle
gawk
und fällt (wie deine Beschreibung) mit ausmawk
. Interessant!awk
- 4.0.2. In freebsd mit/proc/curpoc/cmdline
, undawk
Ergebnis ist wie bei Ihnen, funktioniert aber mitgawk
.awk -vNAME="myscript.awk" ./myscript.awk
als würde man NAME im Skript aufrufen und dann ausdrucken. Keine Lösung.Ich kenne keine direkte Möglichkeit, den Befehlsnamen aus awk heraus zu ermitteln. Sie können es jedoch über eine Unterschale finden.
gaffen
Mit GNU awk und dem
ps
Befehl können Sie die Prozess-ID von verwendenPROCINFO["PID"]
, um den Befehlsnamen als Workaround abzurufen. Beispielsweise:cmdname.awk
mawk und nawk
Sie können den gleichen Ansatz verwenden, jedoch die
awk
PID aus der$PPID
speziellen Shell-Variablen (PID des übergeordneten Elements) ableiten :cmdname.awk
Testen
Führen Sie das Skript folgendermaßen aus:
Ausgabe in beiden Fällen:
quelle
gawk
, ist es einegawk
Lösung anstelle einerawk
Lösung. Ich denke, @cipper sollte seinen Wunsch "eine tragbare Lösung" zur Frage hinzufügen.awk -vNAME="myscript.awk" ./myscript.awk
als würde man NAME im Skript aufrufen und dann ausdrucken. Keine Lösung.Mit POSIX
awk
:Dann:
quelle
awk -vNAME="myscript.awk" ./myscript.awk
und Drucken der VariablenNAME
im Skript. Keine Lösung.mawk
. Und auch usingENVIRON
ist nicht dasselbe wie using-vNAME="myscript.awk"
, damawk
es die Escape-Sequenz in erweitertNAME
.GNU awk verwenden
Überprüfen des GNU awk-Benutzerhandbuchs - 7.5.2 Eingebaute Variablen, auf die ich gestoßen bin:
Dies bedeutet, dass Sie die PID des Programms zur Laufzeit kennen. Dann ist es eine Frage der Verwendung
system()
, nach dem Prozess mit dieser gegebenen PID zu suchen:Ich benutze
ps -ef
, was die PID in der 2. Spalte anzeigt. Vorausgesetzt, die Ausführung erfolgt überawk -f <script>
und keine anderen Parameter, können wir annehmen, dass das letzte Feld der Zeile die gewünschten Informationen enthält.Wenn wir einige Parameter hätten, müssten wir die Zeile anders analysieren - oder besser einige der Optionen verwenden
ps
, um nur die Spalten zu drucken, die uns interessieren.Prüfung
Beachten Sie auch, dass uns ein anderes Kapitel des GNU awk-Benutzerhandbuchs sagt, dass ARGV nicht der richtige Weg ist:
quelle
mawk
und konnte es nicht zum Laufen bringen, so dass ich esgawk
in meinem Ubuntu installiert habe und es funktionierte. Ein Workaround kann also seingawk
: Dgawk
ist unter Ubuntu nicht standardmäßig installiert (oder zumindest in einigen Ubuntu-Versionen, in denenmawk
die Standardimplementierung verwendet wirdawk
). IIRC, ich musste es auch auf Debian installieren.