无法运行awk程序

Rav*_*van 5 awk

我创建了一个简单的 awk 程序文件/media/ravan/data/program

\n\n

代码:

\n\n
#! /usr/bin/awk -f\nBEGIN { print "Don\xe2\x80\x99t Panic bro!" }\n
Run Code Online (Sandbox Code Playgroud)\n\n

在终端中执行时:

\n\n
ravan@ravan:/media/ravan/data/program$ ls\nawkTest.awk  testawk.awk\nravan@ravan:/media/ravan/data/program$ chmod +x awkTest.awk\nravan@ravan:/media/ravan/data/program$ ./awkTest.awk\nbash: ./awkTest.awk: Permission denied\n
Run Code Online (Sandbox Code Playgroud)\n\n

mount输出部分

\n\n
/dev/sda3 on /media/ravan/data type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)\n
Run Code Online (Sandbox Code Playgroud)\n\n

的输出ls -l

\n\n
ravan@ravan:~$ ls -l /media/ravan/data/program\ntotal 1\n-rw------- 1 ravan ravan 55 Nov  9 15:03 awkTest.awk\n-rw------- 1 ravan ravan 52 Nov  9 13:29 testawk.awk\n
Run Code Online (Sandbox Code Playgroud)\n

Wil*_*ard 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标志阻止,并且它将执行您编写的脚本。