【问题标题】:"bad interpreter" error message when trying to run awk executable尝试运行 awk 可执行文件时出现“错误解释器”错误消息
【发布时间】:2013-04-22 17:17:53
【问题描述】:

我正在尝试使 awk 文件可执行。我已经编写了脚本,并且做了chmod +x filename。代码如下:

#!/bin/awk -v

'TOPNUM = $1

## pick1 - pick one random number out of y
## main routine

BEGIN {
## set seed
        srand ()

## get a random number

        select = 1 +int(rand() * TOPNUM)

# print pick
        print select
}'

当我尝试运行程序并为TOPNUM 放入一个变量时:

pick1 50

我得到了回应:

-bash: /home/petersone/bin/pick1: /bin/awk: bad interpreter: No such file or directory

我确定我搞砸了一些简单的事情,但我根本无法弄清楚它是什么。我该如何解决这个问题?

【问题讨论】:

  • awk真的安装到/bin/awk了吗?
  • 尝试“which awk”以查看 akw 在哪里,或者将 #!/usr/bin/env awk 放在顶部而不是 #!/bin/awk。如果 which awk 没有显示任何内容,则需要安装 awk。
  • 谢谢。我会试试看。
  • 请参阅this questionmy answer,了解#!/usr/bin/env 技巧的优缺点。并注意不能使用#!/usr/bin/env awk -v;它不需要多个参数。
  • 感谢您的帮助。它奏效了。

标签: linux awk


【解决方案1】:

从命令行运行以下命令:

which awk

这将打印 AWK 的路径,可能是 /usr/bin/awk。更正第一行,您的脚本应该可以工作。

此外,您的脚本不应在开头和结尾使用单引号字符。您可以从命令行运行 AWK 并将脚本作为带引号的字符串传递,或者您可以在文件中编写脚本并使用 #!/usr/bin/awk 第一行,以及文件中的命令。

另外,脚本的第一行也不能正常工作。在 AWK 中,设置代码需要在 BEGIN 块内,$1 是对输入行中第一个单词的引用。您需要使用ARGV[1] 来引用第一个参数。

http://www.gnu.org/software/gawk/manual/html_node/ARGC-and-ARGV.html

正如@TrueY 指出的,第一行应该有一个-f

#!/usr/bin/awk -f

这里讨论:Invoking a script, which has an awk shebang, with parameters (vars)

程序的工作、测试版本:

#!/usr/bin/awk -f

## pick1 - pick one random number out of y
## main routine
BEGIN {
    TOPNUM = ARGV[1]

## set seed
        srand ()

## get a random number

        select = 1 +int(rand() * TOPNUM)

# print pick
        print select
}

【讨论】:

  • 正常的awk应该是#!/usr/bin/awk -f
【解决方案2】:

其实这种形式更可取:

#! /bin/awk -E 

男人告诉:

-E 与-f 类似,但是,这是最后一个处理的选项,应与#!脚本,特别是对于 CGI 应用程序,以避免在命令行中从 URL 传递选项或源代码 (!)。此选项禁用命令行变量赋值

【讨论】:

  • 这是一个很好的观点,但它没有回答问题。应该是评论。 (但您需要至少 50 个代表点才能在其他人的帖子上发布 cmets。)
猜你喜欢
  • 2012-07-28
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多