我创建了一个简单的 awk 程序文件/media/ravan/data/program
代码:
#! /usr/bin/awk -f
BEGIN { print "Don’t Panic bro!" }
在终端中执行时:
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
mount
输出部分
/dev/sda3 on /media/ravan/data type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
的输出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
答案1
我不知道您的文件系统挂载发生了什么,但解决它非常简单。您只需要了解 shebang 实际上在做什么。
当文件被标记为可执行并且您尝试运行它时,将检查文件的前两个字节。如果是#!
,那么 shell 会将文件的第一行作为命令运行,然后将文件本身的路径作为该命令的参数运行。
换句话说,#!/bin/bash
作为名为 的文件中的第一行放置的/tmp/myscript.sh
,将作为 运行/bin/bash /tmp/myscript.sh
。
同样,当运行时,#!/usr/bin/awk -f
第一行将./awkTest.awk
变为(或者如果您的安装问题没有干扰,则应该变为)/usr/bin/awk -f ./awkTest.awk
。
解决方案是直接运行awk -f awkTest.awk
,您的脚本就会按预期运行。
请注意,因为awk
是解释的而不是编译,noexec
保存 awk 脚本的设备的安装选项上的标志惯于阻止您运行脚本。它只会阻止您运行它作为可执行文件。所以你需要做的就是运行你的awk
二进制可执行文件(/usr/bin/awk
),它将读您的awk
脚本,当然不会被该noexec
标志阻止,并且它将执行您编写的脚本。