En bash $0
contient le nom du script, mais en awk si je crée un script nommé myscript.awk avec le contenu suivant:
#!/usr/bin/awk -f
BEGIN{ print ARGV[0] }
et l'exécuter, il affichera seulement "awk". En outre, ARGV [i] avec i> 0 est utilisé uniquement pour les arguments de script en ligne de commande. Alors, comment faire en sorte qu'il affiche le nom du script, dans ce cas "myscript.awk"?
mawk
c'est par défaut sur Ubuntu? Sur ma VM 15.04, la valeur par défautawk
estgawk
. Bien que mawk soit installé, ce n'est pas la valeur par défaut.awk -f myscript.awk
. Cependant, cela n'est pas lié au problème en question.awk
script car il commence par#!/usr/bin/awk -f
. Les scripts shell commencent par#!/bin/sh
(ou quelque chose de similaire).awk -f file
.Réponses:
Avec GNU awk 4.1.3 dans bash sur cygwin:
Je ne sais pas à quel point c'est portable. Comme toujours, cependant, je n'exécuterais pas un script awk en utilisant un shebang dans un script shell car cela vous prive simplement de fonctionnalités possibles. Restez simple et faites-le à la place:
Ce dernier fonctionnera avec n'importe quel awk moderne dans n'importe quel shell sur n'importe quelle plate-forme.
la source
ENVIRON["_"]
fonctionne parfaitement, et il n'appelle aucun programme externe. La deuxième optionawk -v ...
dépend de la façon dont on exécute le script; Je ne veux pas ça.tst.sh
est trompeur. C'est unawk
script, pas un script shell.BEGIN
n'est pas une commande shell valide.ENVIRON["_"]
produit le chemin du script du shell appelant lorsqu'il est imprimé depuis chaque awk appelé via un shebang depuis chaque shell"? Je n'appellerais jamais un script awk d'un shebang à personnellement je ne me soucie pas de la réponse mais pensais juste que je le mentionnerais ... Oh je vois dans les commentaires ci-dessus que @cuonglm a répondu qu'il n'est pris en charge que dans certains shells .*12345*/tmp/test.awk
.ARGV[0]
est toujours fiableawk
dans dash, bash, zsh et ksh93.Je ne pense pas que cela soit possible selon la
gawk
documentation :On
linux
peut essayer d'utiliser une sorte de hack sale et comme le soulignent les commentaires de Stéphane Chazelas c'est possible si l'implémentation desawk
supports NUL prend en charge:la source
gawk
et échoue (comme votre description) avecmawk
. Intéressant!awk
- 4.0.2. En freebsd avec/proc/curpoc/cmdline
, et leawk
résultat est comme le vôtre mais fonctionne avecgawk
.awk -vNAME="myscript.awk" ./myscript.awk
puis imprimer NOM dans le script. Pas une solution.Je ne connais aucun moyen direct d'obtenir le nom de la commande depuis awk. Vous pouvez cependant le trouver à travers un sous-shell.
rester bouche bée
Avec GNU awk et la
ps
commande, vous pouvez utiliser l'ID de processusPROCINFO["PID"]
pour récupérer le nom de la commande comme solution de contournement. Par exemple:cmdname.awk
mawk et nawk
Vous pouvez utiliser la même approche, mais dérivez
awk
le PID de la$PPID
variable shell spéciale (PID du parent):cmdname.awk
Essai
Exécutez le script comme ceci:
Sortie dans les deux cas:
la source
gawk
c'est unegawk
solution au lieu d'uneawk
solution. Je pense que @cipper devrait ajouter son souhait "une solution portable" à la question.awk -vNAME="myscript.awk" ./myscript.awk
puis imprimer NOM dans le script. Pas une solution.Avec POSIX
awk
:Alors:
la source
awk -vNAME="myscript.awk" ./myscript.awk
puis imprimer la variableNAME
à l'intérieur du script. Pas une solution.mawk
. Et l'utilisationENVIRON
n'est pas la même chose que l'utilisation-vNAME="myscript.awk"
, car quandmawk
étendra la séquence d'échappement dansNAME
.Utiliser GNU awk
Vérification du guide de l'utilisateur de GNU awk - 7.5.2 Variables intégrées qui véhiculent des informations sur lesquelles je suis tombé:
Cela signifie que vous pouvez connaître le PID du programme pendant l'exécution. Ensuite, il s'agit d'utiliser
system()
pour rechercher le processus avec ce PID donné:J'utilise
ps -ef
, qui affiche le PID sur la 2ème colonne. En supposant que l'exécutiong se fait viaawk -f <script>
sans aucun autre paramètre, nous pouvons supposer que le dernier champ de la ligne contient les informations souhaitées.Dans le cas où nous avions certains paramètres, nous aurions à analyser la ligne différemment - ou, mieux, utiliser certaines des options de
ps
pour imprimer uniquement les colonnes qui nous intéressent.Tester
Notez également qu'un autre chapitre du guide de l'utilisateur de GNU awk nous dit que ARGV n'est pas la voie à suivre:
la source
mawk
et ne pouvais pas le faire fonctionner, alors j'ai installégawk
dans mon Ubuntu et cela a fonctionné. Une solution peut donc être utiliséegawk
: Dgawk
n'est pas installé par défaut sur Ubuntu (ou au moins certaines versions d'Ubuntu, où semawk
trouve l'awk
implémentation par défaut ). IIRC, je devais également l'installer sur Debian.