2009-09-13 7 views
16

je un script awk que je l'ai défini ainsi:invocation d'un script, qui a une shebang awk, avec des paramètres (vars)

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

je l'ai enregistré en tant que columns et chmod +x « d elle. Je veux l'invoquer afin que start et end soient définis lors de son passage sur un fichier. Je pensais que cela devrait fonctionner:

cat some_file | columns -v start=2 

Mais ce n'est pas le cas. Aidez-moi!

Répondre

33

Essayez d'utiliser:

#!/usr/bin/awk -f 

comme interprète

+0

+1 pour la solution la plus portable, car il utilise un seul argument. Même si le chemin d'accès 'awk' est codé en dur - par nécessité, dû à l'argument _one_ - cela devrait fonctionner sur toutes les plateformes Unix modernes. (Dites-le si vous connaissez un endroit où ce n'est pas le cas.) – mklement0

+1

@ mklement0 Ce n'est pas le mien (NixOS). Depuis NixOS conserve tous les paquets isolés et sur des chemins non standard. Je pense que l'utilisation de la réponse de mss serait mieux dans mon cas. ** EDIT ** Cela ne marche pas non plus puisque '-S' n'est pas compatible avec POSIX :( –

+0

@PallavAgarwal: Bon à savoir sur la différence de NixOS Notez que tant que votre système d'exploitation peut gérer _multiple_ tokens sur la ligne shebang, En d'autres termes: '#!/usr/bin/env awk -f' _may_ fonctionne pour vous (fonctionne sur OS X, par exemple, mais pas sur Linux) – mklement0

4

env est la meilleure façon de gérer ce problème:

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

pour ajouter d'autres options et pour assurer aucune interférence avec votre arguments, et les arguments d'awk:

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

Comme env a un standard POSIX, ce shbang devrait vous aider à contourner les difficultés des implémentations shbang non-standard à travers unixen.

EDIT

après avoir écrit ce je compris que 'S' est une extension de env FreeBSD non-POSIX. Donc, l'enveloppe de shell est probablement le chemin à parcourir, aussi malheureux soit-il.

+8

Merci d'avoir signalé que '-S' n'est pas standard . – dubiousjim

0

Voici la réponse à ce problème -

#!/bin/awk -f