我正在阅读某人的 awk 脚本。以 header #!/usr/bin/env awk -f
开头。 env 命令没有 -f
选项。因此,他们必须为 awk 命令传递 -f
选项。我查看了 awk 的手册页。它说 Awk 扫描每个输入文件以查找与 prog 中字面指定的一组模式或指定为 -f progfile 的一个或多个文件中的任何模式匹配的行。对于每个模式,都可以有一个关联的操作,当文件的一行与该模式匹配时将执行该操作。
根据我的理解,这意味着 awk 通过搜索具有 progfile/prog 中指定模式的行来处理输入文件,具体取决于您是否对 awk 使用 -f 选项。并且根据使用的模式,对输入文件中找到的行执行关联的操作。我的问题是……在运行 awk 脚本文件时这是如何工作的?我们没有在 #!/usr/bin/env awk -f
行中指定 progfile。 awk 脚本将使用什么模式?或者这是否意味着我们必须在运行 awk 脚本时传递 progfile?如果是这样,在脚本中指定 -f 选项不是多余的吗?如果我们不指定 progfile,-f 选项会被默认忽略或抛出错误吗?
为了更好地理解这一点,我编写了一个简单的 awk 脚本并将其保存为 test.awk
#!/usr/bin/env awk -f
BEGIN { print "START" }
当我运行它时,字符串“START”被打印在屏幕上。
prachis-mbp-2:~ pskhadke$ ./test.awk
START
如果我从 awk 脚本的第一行删除 -f
选项并运行它,我会收到以下错误:
prachis-mbp-2:~ pskhadke$./test.awk
awk: syntax error at source line 1
context is
>>> . <<< /test.awk
同样,
prachis-mbp-2:~ pskhadke$ awk test.awk
awk: syntax error at source line 1
context is
>>> test. <<< awk
awk: bailing out at source line 1
因此出于某种原因,如果没有 -f
选项,它无法正确解析参数。但是为什么?
最佳答案
文件名附加到 shebang 行中命令的末尾。因此,对于标题为 #!/usr/bin/env awk -f
的文件 test.awk
有效执行的结果命令行将是 awk -f test .awk
,将 test.awk
视为要执行的脚本文件,而不是数据输入文件。
最好的例子:创建一个文件test
,唯一的内容是#!/bin/rm
,让它可执行(例如chmod 755
) 并尝试通过运行 ./test
来执行它。现在,那个文件去了哪里:)
关于linux - 了解 shebang 行中的 awk -f 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34009196/