No se puede ejecutar el progtwig awk

He creado un file de progtwig awk simple en /media/ravan/data/program

El código:

 #! /usr/bin/awk -f BEGIN { print "Don't Panic bro!" } 

Mientras se ejecuta en la terminal:

 ravan@ravan:/media/ravan/data/program$ ls awkTest.awk testawk.awk ravan@ravan:/media/ravan/data/program$ chmod +x awkTest.awk ravan@ravan:/media/ravan/data/program$ ./awkTest.awk bash: ./awkTest.awk: Permission denied 

La parte de salida de mount

 /dev/sda3 on /media/ravan/data type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096) 

La salida de ls -l

 ravan@ravan:~$ ls -l /media/ravan/data/program total 1 -rw------- 1 ravan ravan 55 Nov 9 15:03 awkTest.awk -rw------- 1 ravan ravan 52 Nov 9 13:29 testawk.awk 

No sé qué está pasando con su assembly del sistema de files, pero trabajar en torno a él es muy simple. Solo necesitas entender qué está haciendo realmente el shebang.

Cuando un file se marca como ejecutable e intenta ejecutarlo, se verifican los primeros dos bytes del file. Si son #! , entonces el intérprete de commands ejecutará esa primera línea de su file como un command, seguido por la ruta al file mismo como argumento para ese command.

En otras palabras, #!/bin/bash , colocado como la primera línea en un file llamado /tmp/myscript.sh , se ejecutará como /bin/bash /tmp/myscript.sh .

Del mismo modo, #!/usr/bin/awk -f como la primera línea de ./awkTest.awk , cuando se ejecuta, se convierte (o debería ser si el problema de su assembly no estuviera interfiriendo) /usr/bin/awk -f ./awkTest.awk .

La solución es ejecutar awk -f awkTest.awk y su script se ejecutará como se espera.


Tenga en count que dado que awk se interpreta en lugar de comstackrse, un indicador noexec en las opciones de assembly del dispositivo que contiene su script awk no le impedirá ejecutar el script. Solo le impide ejecutarlo como un ejecutable . Entonces, todo lo que necesita hacer es ejecutar su file ejecutable awk binary ( /usr/bin/awk ) y leerá su script awk , que por supuesto no está impedido por el indicador noexec , y hará lo que ha escrito.