我awk
今天正在学习,但我无法成功使用最简单的脚本。
#!/usr/bin/env -S awk -f
BEGIN { }
{ }
END { }
这输出BEGIN: command not found
甚至
#!/usr/bin/env -S awk -f
{}
这输出{}: 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
采购不等于执行。具体来说,sourcing 需要一个可以在当前 shell 中执行的命令列表。以下来自 bash 的
help .
:因此,当您运行时
. file
,您的 shell 将读取该文件并执行它找到的每个命令。但是,这意味着 shebang 行将被忽略,并被视为常规注释。因此,您的 shell 而不是 awk 正在尝试执行BEGIN
.为避免这种情况,您应该执行脚本而不是采购它。如果出于某种原因,您只需要获取它,请在脚本中编写 awk 命令:
然后,你可以做
虽然我真的想不出你为什么会想要。
顺便说一句,您应该知道
.
(或source
,在 bash 中)$PATH
默认情况下会在您的文件名中查找文件名。因此,如果您运行. foo
,并且foo
在当前目录中有一个文件,并且foo
在您的任何目录中有一个文件$PATH
,那么将获取的文件是您的文件,$PATH
而不是当前目录中的文件。为避免这种情况,请在采购时始终使用完整路径:. ./foo
.正如 AdminBee 在评论中提到的那样,该脚本以错误的方式调用(获取内容)。
正确的方法是:
或者,更简单地说,不依赖于
#!
行:永远不要使用 shebang 来调用 awk,因为这会剥夺您将脚本参数分成应该在 shell 中完成的部分与应该在 awk 中完成的部分以及将 awk 参数与 awk 变量分配分开的能力。只需将您的脚本编写为:
有时您想修改它以执行设置 awk 变量之类的操作:
这应该像上面那样微不足道,但如果你用 shebang 调用 awk,你就不能这样做。