开始:通过采购运行时,在简单的 awk 脚本中找不到命令

Ste*_*and 2 awk

awk今天正在学习,但我无法成功地使用最简单的脚本来工作。

#!/usr/bin/env -S awk -f
BEGIN { }
{ }
END { }
Run Code Online (Sandbox Code Playgroud)

这输出 BEGIN: command not found

甚至

#!/usr/bin/env -S awk -f
{}
Run Code Online (Sandbox Code Playgroud)

这输出 {}: command not found

当我启动时$ /usr/bin/env -S awk -f,我确实有显示其默认输出的 awk 可执行文件。

$ awk --version说它是 awk 版本 5.0.1 ,在 nixos 19.09 上。

我需要使用/usr/bin/env,因为 nixos 文件不遵循传统的 FHS 目录层次结构。

我怀疑我遗漏了一些明显的东西,但看起来 awk 教程和 SO 问题目前还没有给我任何线索。

编辑:我用来启动脚本的命令行

ls -l | . testawk.sh
Run Code Online (Sandbox Code Playgroud)

ter*_*don 8

采购不等于执行。具体来说,source 需要一个可以在当前 shell 中执行的命令列表。以下是来自 bash 的help .

.: . 文件名 [参数]

从当前 shell 中的文件执行命令。

在当前 shell 中从 FILENAME 读取和执行命令。$PATH 中的条目用于查找包含 FILENAME 的目录。如果提供了任何 ARGUMENTS,它们将在执行 FILENAME 时成为位置参数。

因此,当您运行 时. file,您的 shell 将读取该文件并执行它找到的每个命令。然而,这意味着 shebang 行被忽略并被视为常规注释。因此,您的 shell 而不是 awk,试图执行BEGIN.

为避免这种情况,您应该执行脚本而不是获取它。如果出于某种原因,您只需要获取它,请在脚本中编写一个 awk 命令:

awk '
BEGIN { }
{ }
END { }'
Run Code Online (Sandbox Code Playgroud)

然后,你可以做

ls | . ./a.awk 
Run Code Online (Sandbox Code Playgroud)

虽然我真的想不出为什么你会想要。


顺便说一句,您应该知道.(或source在 bash 中)$PATH默认在您的文件中查找文件名。因此,如果您运行. foo, 并且foo在当前目录中有一个文件,并且foo在您的任何目录中有一个文件$PATH,那么将被获取的文件是您的文件,$PATH而不是您当前目录中的文件。为避免这种情况,请在采购时始终使用完整路径:. ./foo.