2009-09-13 4 views
16

Ich habe ein awk Skript, das ich so definiert haben:ein Skript aufrufen, die eine awk shebang hat, mit Parametern (Vars)

#!/usr/bin/env awk 
BEGIN { if (!len) len = 1; end = start + len } 
{ for (i = start; i < end; i++) { print $1 } } 

I gespeichert haben es als columns und chmod +x ‚it d. Ich möchte es aufrufen, so dass start und end definiert sind, wie es über eine Datei durchläuft. Ich dachte, das sollte funktionieren:

cat some_file | columns -v start=2 

Aber es tut es nicht. Hilfe! mit

Antwort

33

Versuchen:

#!/usr/bin/awk -f 

als Dolmetscher

+0

+1 für die meisten tragbare Lösung, da es nur ein einziges Argument verwendet. Auch wenn der Pfad zu 'awk' fest codiert ist - aus Notwendigkeit, sich mit einem Argument zu begnügen - sollte dies auf allen modernen Unix-Plattformen funktionieren. (Sagen Sie, wenn Sie wissen, wo Sie es nicht wissen.) – mklement0

+1

@ mklement0 Es ist nicht auf meiner (NixOS). Da NixOS alle Pakete isoliert und auf nicht standardmäßigen Pfaden hält. Ich denke, die Antwort von mss wäre in meinem Fall besser. ** EDIT ** Das funktioniert auch nicht, da '-S' ist nicht POSIX-konform :( –

+0

@PallavAgarwal: Gut zu wissen, wie NixOS unterscheidet. Beachten Sie, dass solange Ihr Betriebssystem _multiple_ Tokens auf der Shebang-Linie behandeln kann, Du bist gut, mit anderen Worten: '#!/usr/bin/env awk -f' _may_ funktioniert für dich (funktioniert unter OS X, aber nicht unter Linux) – mklement0

4

env ist der einfachste Weg, um dieses Problem zu umgehen:

#!/usr/bin/env -S awk -f 

, um weitere Optionen hinzuzufügen und keine Störungen zu gewährleisten mit Ihrem Argumente und awks Argumente:

#!/usr/bin/env -S awk -F: -f ${_} -- 
BEGIN { 
    # delete argv[1], which == ENVIRON[_] 
    delete ARGV[1] 
} # rest of my awk program 

Da env über einen POSIX-Standard verfügt, sollte dieser Shbang Sie über die Schwierigkeiten von nicht standardisierten Shbang-Implementierungen über Unix hinweg bringen.

EDIT

nach dieser , dass ich erkannte, geschrieben zu haben '-S' ein nicht-POSIX ist konform FreeBSD env Erweiterung. So Shell Wrapper ist wahrscheinlich der Weg zu gehen, so unglücklich wie das ist.

+8

Danke, dass "-S" nicht Standard ist . – dubiousjim

0

Im Folgenden finden Sie die Antwort für dieses Problem -

#!/bin/awk -f 
Verwandte Themen