Kann ich Argumente, die zufällig AWK-Optionen sind, direkt an ein reines AWK-Skript übergeben werden?
Beispielskript:
#!/usr/bin/env -S awk -f
BEGIN { if (ARGV[1] == "-h") print "whoop" }
Ich möchte ./myscript -h
„whoop“ drucken. Aber AWK holt zuerst das „-h“ ab und druckt stattdessen dessen Verwendung.
Das Ausführen ./myscript -- -h
funktioniert, aber ich kann -- im Shebang wegen des -f nicht zum Laufen bringen.
Ich weiß, dass ich stattdessen ein Shell-Skript mit AWK verwenden könnte.
Antwort1
Der Herausforderung halber könnte es mit dem FreeBSD durchgeführt werdenenv
oder mit GNUUmgebung>= 8.30 (vom OP bereits angenommen) in einem Shebang:
#! /usr/bin/env -S sh -c 'exec awk -f "$0" -- "$@"'
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }
./myscript -h 1 2 3
-h
1
2
3
Das bedeutet jedoch nicht, dass es eine gute Idee ist.
Sie könnten stattdessen Folgendes versuchen:
#! /bin/sh
BEGIN { 2>"/dev/null"
exec awk -f "$0" "--" "$@"
}
BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }
Dies setzt voraus, dass Sie keinen Befehl BEGIN
in Ihrem haben PATH
.
Antwort2
Wenn Sie GNU haben, awk
können Sie dies verwenden
#!/usr/bin/gawk --exec
BEGIN { print "==>",ARGV[1],"<==" }
Beispiele für die Verwendung
./a -h
==> -h <==
Ich habe es nicht getestet, aber die mawk
Variante scheint -W exec
anstelle von zu verwenden --exec
. GNU gawk
behauptet, dies ebenfalls zu unterstützen, aber es funktioniert nicht mit #!
.