2009-09-13 7 views
16

mam AWK że zdefiniowany w następujący sposób:Wywoływanie scenariusz, który ma shebang awk z parametrem (vars)

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

I zapisany jako columns i chmod +x „to R. Chcę go wywołać, tak aby zdefiniowano start i podczas przechodzenia przez plik. Myślałem, że to powinno zadziałać:

cat some_file | columns -v start=2 

Ale tak nie jest. Wsparcie!

Odpowiedz

33

Spróbuj użyć:

#!/usr/bin/awk -f 

jako tłumacza

+0

+1 dla większości przenośnych rozwiązania, ponieważ używa tylko jeden argument. Mimo że ścieżka do 'awk' jest zakodowana na stałe - z konieczności, z powodu konieczności czynienia z jednym argumentem - powinno to działać na wszystkich współczesnych platformach uniksowych. (Powiedz, czy wiesz o jakimkolwiek miejscu, w którym się nie znajduje.) – mklement0

+1

@ mklement0 To nie dotyczy moich (NixOS). Ponieważ NixOS utrzymuje wszystkie pakiety izolowane i na niestandardowych ścieżkach. Myślę, że używanie odpowiedzi mss byłoby lepsze w moim przypadku. ** EDIT ** To nie działa, ponieważ '-S' jest niezgodny z POSIX :( –

+0

@PallavAgarwal: Dobrze wiedzieć o tym, jak różni się NixOS.Zauważ, że tak długo, jak twój OS może obsłużyć _multiple_ tokeny na linii shebang, jesteś dobry, innymi słowy: '#!/usr/bin/env awk -f' _may_ działa dla ciebie (działa na systemie OS X, na przykład, ale nie na Linuksie) – mklement0

4

env jest najprostszym sposobem, aby poradzić sobie z tym problemem:

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

aby dodać więcej opcji, i aby nie dopuścić do zakłócenia ze swoimi argumenty i argumenty awk:

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

ponieważ env ma standard POSIX, ten shbang powinien omówić trudności związane z niestandardowymi implementacjami shbang w systemie unixen.

EDIT

po Napisałem ten zdałem sobie sprawę, że 'S' jest nie-POSIX zgodny FreeBSD env rozszerzenie. Więc opakowanie powłoki jest prawdopodobnie drogą, która jest niefortunna.

+8

Dziękujemy za zwrócenie uwagi, że '-S' jest niestandardowe . – dubiousjim

0

Poniżej jest odpowiedzią na ten problem -

#!/bin/awk -f