Czy zwykle gawk znajduje się w / bin lub / usr / bin? Poszedłbym z tym, #!/usr/bin/env gawk
ale wtedy nie mogę używać argumentów. Teraz używam #!/bin/gawk -f
. Skrypt jest bardzo długi i zawiera wiele pojedynczych cudzysłowów i współpracuje ze stdin.
Podręcznik GNU Awk zawiera sekcję 1.1.4 Wykonywalne programy awk, w których używa #! / Bin / awk w swoim przykładzie, ale mówi dalej:
Zauważ, że w wielu systemach
awk
można znaleźć/usr/bin
zamiast w/bin
. Zastrzeżenie Emptor.
Co robi większość ludzi? Przeczytałem, że sed jest podobno ustandaryzowany w / bin, podczas gdy perl jest podobno ustandaryzowany w / usr / bin (ta sama strona co link sed, ale nie pozwalają mi na utworzenie trzeciego linku do tego postu). Co z awk / gawk? Czy ktoś wie, który jest bardziej powszechny lub popularny?
-f
? Nie/bin/gawk
wystarczy Także, to może być istotne.Odpowiedzi:
Shebang nie miał być tak elastyczny . Mogą istnieć przypadki, w których drugi parametr działa , myślę, że FreeBSD jest jednym z nich.
gawk i większość programów narzędziowych, które są dostarczane z systemem operacyjnym, powinny być dostępne
/usr/bin/
.W starszych czasach systemu UNIX powszechne było
/usr/
montowanie w systemie plików NFS lub na niektórych tańszych nośnikach w celu zaoszczędzenia miejsca na dysku lokalnym i kosztów na stację roboczą./bin/
miał mieć wszystko, co potrzebne do uruchomienia w trybie pojedynczego użytkownika . Ponieważ/usr/
nie został zamontowany na niezawodnym nośniku,/bin/
zawierał wystarczającą liczbę narzędzi, aby uczynić go wystarczająco przyjaznym do ogólnej administracji i rozwiązywania problemów.Zostało to odziedziczone początkowo w Linuksie, ale ponieważ przestrzeń dyskowa nie stanowi już problemu, aw większości przypadków
/usr/
znajduje się w głównym systemie plików, obecnym trendem jest przenoszenie wszystkiego/usr/bin
(przynajmniej w świecie Linuksa). Dlatego oczekuje się, że znajdzie się tam większość narzędzi zainstalowanych przez dystrybucję. Nawet najbardziej podstawowe narzędzia, takie jakcp
,rm
,ls
itp (no, jeszcze nie).Jeśli chodzi o wybór shebang. Tradycyjnie jest to coś, co administratorzy lub użytkownicy muszą edytować w zależności od środowiska. Dla wszystkich programista wie, w systemach innych ludzi, interpreter może być gdziekolwiek w systemie plików (np
/usr/local/bin
,/opt/gawk-4.0.1/bin
). Prawidłowo spakowane skrypty (rpm, deb itp.) Pochodzą albo z zależności od pakietu dystrybucyjnego (tzn. Interpreter ma znaną lokalizację), albo ze skryptu konfiguracyjnego, który konfiguruje właściwy hashbang podczas instalacji.źródło
Jeśli nie musisz przekazywać argumentów do polecenia,
#!/usr/bin/env gawk
jest to dobry sposób, jednak wiele jąder (w tym Linux) akceptuje tylko jeden argument w programach shebang.W przeciwnym razie możesz utworzyć program poliglotyczny , który jest zarówno opakowaniem powłoki, jak i skryptem awk. Oto jeden na awk.
Analiza powłoki:
true + /;
- polecenietrue
(które nic nie robi) z dwoma obojętnymi argumentami+
i/
.gawk
. Może to być dowolny fragment powłoki, który nie zawiera znaków nowej linii i gdzie są pisane ukośniki\/
(powłoka nie ma nic przeciwko, oprócz cytatów wewnętrznych).Wywołanie używa
exec
do zastąpienia powłoki gawk zamiast wykonywania gawk jako podprocesu.exit;
- wyjdź z powłoki, na wypadek gdyby gawk nie został znaleziony. Wszystko, co później zostanie zignorowane, z wyjątkiem tego, że powinna być poprawna składnia powłoki na wypadek, gdyby powłoka spróbowała parsować całą linię przed jej uruchomieniem.Awk parsowanie:
true + /REGEX/
- stan.true
jest niezdefiniowaną zmienną, więc jej wartość liczbowa wynosi 0, ale nie ma znaczenia.{}
- Jeśli wspomniany warunek się utrzymuje, nie rób nic.źródło
Proponowane rozwiązanie Gillesa jest rzeczywiście bardzo dobrym podejściem (w końcu ma reputację głosować w swoim poście :)).
W każdym razie, o ile rozumiem
exec
polecenie, powoduje, żeexit
zaraz po nim jest niepotrzebne, w rzeczywistości nieosiągalne, ponieważ proces powłoki jest zastępowany przezawk
.Ponadto, aby umożliwić
awk
skryptowi dostęp do jego parametrów wywołania, sugerowałbym pewne zmiany w proponowanym rozwiązaniu:-a "$0"
Pozwala skrypt mieć dostęp do swojej nazwy wywołania, inaczej będzie zawsze dostaćawk
lubgawk
podczas uzyskiwania dostępu doARGV[0]
zmiennej. Podobnie,"$@"
skrypt pozwala na dostęp do pozostałych parametrów wARGV[1...N]
tablicy, a--
poprzedni pozwala skryptowi na otrzymywanie-<something>
argumentów bez interpretacji ich przez gawk.Jedną rzeczą do zapamiętania / rozważenia jest dodanie
exit(0);
instrukcji na końcuBEGIN { ... }
blokuawk
programu skryptowego, w przeciwnym razieawk
zagrozi wszystkim parametrom przekazanym do skryptu jako pliki wejściowe. (Pamiętaj, że w ogóle nie ma to nic wspólnego zexit
instrukcją, którą usunęliśmy ztrue + ...
wiersza, była to nieosiągalna instrukcja powłoki, podczas gdy to sugerowane wyjście znajduje się w kodzie awk).źródło
exit(0)
było bardzo przydatne! Ponadto, dla użytkowników systemu Macos, zapoznaj się z tą treścią: dobry przenośny awk shebang nie jest łatwy do znalezienia.