W bash $0
zawiera nazwę skryptu, ale w awk, jeśli utworzę skrypt o nazwie myscript.awk o następującej treści:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
i uruchom go, wypisze tylko „awk”. Poza tym ARGV [i] z i> 0 służy tylko do argumentów skryptu w wierszu poleceń. Jak więc wydrukować nazwę skryptu, w tym przypadku „myscript.awk”?
mawk
jest domyślny w Ubuntu? Na mojej maszynie wirtualnej 15.04 domyślną wartościąawk
jestgawk
. Podczas gdy mawk jest zainstalowany, nie jest domyślny.awk -f myscript.awk
. Nie ma to jednak związku z omawianym problemem.awk
skrypt, ponieważ zaczyna się od#!/usr/bin/awk -f
. Skrypty powłoki zaczynają się od#!/bin/sh
(lub czegoś podobnego).awk -f file
.Odpowiedzi:
Z GNU awk 4.1.3 w bash na cygwin:
Nie wiem, jak to jest przenośne. Jak zawsze jednak nie wykonałbym skryptu awk za pomocą shebang w skrypcie powłoki, ponieważ po prostu okrada cię z możliwej funkcjonalności. Uprość to i po prostu zrób to zamiast tego:
To ostatnie będzie działać z każdym nowoczesnym awk w dowolnej powłoce na dowolnej platformie.
źródło
ENVIRON["_"]
działa idealnie i nie wywołuje żadnego programu zewnętrznego. Druga opcjaawk -v ...
zależy od sposobu uruchomienia skryptu; Nie chce tegotst.sh
jest mylące. Toawk
skrypt, a nie skrypt powłoki.BEGIN
nie jest prawidłowym poleceniem powłoki.ENVIRON["_"]
generuje ścieżkę skryptu powłoki wywołującej, gdy jest drukowana z każdego awk wywoływanego przez shebang z każdej powłoki ”? Nigdy nie wywołałbym skryptu awk z shebang, ale osobiście nie dbam o odpowiedź, ale pomyślałem, że o tym wspomnę ... Och, widzę w komentarzach powyżej, że @cuonglm odpowiedział, że jest obsługiwany tylko w niektórych powłokach .*12345*/tmp/test.awk
.ARGV[0]
jest niezawodnie zawszeawk
w myślniku, bashu, zsh i ksh93.Nie sądzę, że jest to możliwe zgodnie z
gawk
dokumentacją :Na
linux
możesz spróbować użyć pewnego rodzaju brudnego hacka i jak wskazano w komentarzach Stéphane Chazelas , możliwe jest, jeśli implementacjaawk
obsługuje bajty NUL:źródło
gawk
i kończy się niepowodzeniem (jak twój opis) zmawk
. Ciekawy!awk
- 4.0.2. W FreeBSD z/proc/curpoc/cmdline
, aawk
wynik jest jak twoje, ale działa zgawk
.awk -vNAME="myscript.awk" ./myscript.awk
a następnie wydrukować NAME w skrypcie. Nie rozwiązanie.Nie znam żadnego bezpośredniego sposobu uzyskania nazwy polecenia z poziomu awk. Można go jednak znaleźć w podpowłoce.
gapić się
Za pomocą GNU awk i
ps
polecenia możesz użyć identyfikatora procesu,PROCINFO["PID"]
aby pobrać nazwę polecenia jako obejście. Na przykład:cmdname.awk
mawk i nawk
Możesz użyć tego samego podejścia, ale uzyskaj
awk
PID ze$PPID
specjalnej zmiennej powłoki (PID rodzica):cmdname.awk
Testowanie
Uruchom skrypt w następujący sposób:
Dane wyjściowe w obu przypadkach:
źródło
gawk
konieczne, jest togawk
rozwiązanie zamiastawk
rozwiązania. Myślę, że @cipper powinien dodać swoje pytanie „przenośne rozwiązanie” do pytania.awk -vNAME="myscript.awk" ./myscript.awk
a następnie wydrukować NAME w skrypcie. Nie rozwiązanie.Z POSIX
awk
:Następnie:
źródło
awk -vNAME="myscript.awk" ./myscript.awk
a następnie wydrukowanie zmiennejNAME
w skrypcie. Nie rozwiązanie.mawk
. A także używanieENVIRON
nie jest tym samym, co używanie-vNAME="myscript.awk"
, ponieważ kiedymawk
rozwinie sekwencję zmiany znaczenia wNAME
.Korzystanie z GNU awk
Sprawdzanie podręcznika użytkownika GNU awk - 7.5.2 Wbudowane zmienne, które przekazują informacje Natknąłem się na:
Oznacza to, że możesz znać PID programu podczas działania. Następnie
system()
należy poszukać procesu z tym danym PID:Używam
ps -ef
, który wyświetla PID w drugiej kolumnie. Zakładając, że wykonanie zostało wykonaneawk -f <script>
bez żadnych innych parametrów, możemy założyć, że ostatnie pole wiersza zawiera potrzebne informacje.Gdybyśmy mieli jakieś parametry, musielibyśmy przeanalizować wiersz inaczej - lub, lepiej, skorzystać z niektórych opcji
ps
drukowania tylko interesujących nas kolumn.Test
Zauważ również, że kolejny rozdział podręcznika użytkownika GNU awk mówi nam, że ARGV nie jest właściwą drogą:
źródło
mawk
i nie mogłem sprawić, aby działał, więc zainstalowałemgawk
w moim Ubuntu i działało. Można więc zastosować obejściegawk
: Dgawk
nie jest domyślnie instalowany na Ubuntu (lub przynajmniej niektórych wersjach Ubuntu, gdziemawk
jest domyślnąawk
implementacją). IIRC, musiałem również zainstalować go na Debianie.