【问题标题】:Run awk file from shell script without specifying awk's exact location从 shell 脚本运行 awk 文件而不指定 awk 的确切位置
【发布时间】:2011-08-26 15:06:30
【问题描述】:

我正在尝试调试调用 awk 文件的 shell 脚本。 这是一场噩梦,因为我以前从未使用过,我对 linux 也不是很流利,但无论如何

开发人员制作了一个 awk 文件并尝试在 shell 脚本中运行它。

为了尝试从单独的位置运行它,而不需要指定确切的位置,他们将 awk 脚本放在 PATH 变量中的文件夹中。所以这个 awk 文件应该随处可用,对吧?

当你像这样运行它时......

awk -f script.awk arg1

...awk 能找到那个脚本吗? 当 shell 脚本试图运行那个 awk 命令时,它会报错:

awk: fatal: 无法打开源文件 `script.awk' 进行读取(没有这样的文件或目录)

【问题讨论】:

    标签: linux shell awk


    【解决方案1】:

    如您所知,awk 找不到脚本本身。

    如果脚本被标记为可执行,并且你有一个which 命令,那么你应该能够做到:

    awk -f `which script.awk` arg1
    

    另外一种可能更好的是,将脚本制作成可执行文件:

    #!/usr/bin/awk -f 
    BEGIN { x = 23 }
          { x += 2 }
    END   { print x }
    

    shebang 需要 '-f' 选项才能在我测试过的 MacOS X 10.7.1 上工作:

    $ script.awk script.awk
    31
    $
    

    这为您提供了一个独立的单文件解决方案。

    【讨论】:

    • +1 表示 #! 方法,尽管许多 UNIX 应该更喜欢 #!/usr/bin/env awk (reference)
    • @sehe:我会使用#!/usr/bin/env awk,除非你只能保证一个参数,而我需要-f。事实上,我尝试使用#!/usr/bin/env awk 并在它不起作用时遇到了一些挫败感(但是,回过头来,使用#!/usr/bin/env awk -f 确实在MacOS X 上工作)。 YMMV。值得一提的是#!/usr/bin/env...
    【解决方案2】:

    不,那是行不通的。 awk 需要脚本的路径才能运行,它不会使用 PATH 变量来查找它。 PATH 仅用于查找可执行文件。

    【讨论】:

    • 没错,命令应该是awk -f /path/to/script.awk arg1
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多