我正在阅读某人的 awk 脚本。从头文件 #!/usr/bin/env awk -f
开始。 env 命令没有 -f
选项。因此,他们必须为 awk 命令传递 -f
选项。我查看了 awk 的手册页。它说 Awk 扫描每个输入文件以查找与 prog 或指定为 -f progfile 的一个或多个文件中逐字指定的一组模式中的任何一个匹配的行。对于每个模式,可以有一个关联的操作,当文件的一行与该模式匹配时将执行该操作。
根据我的理解,这意味着 awk 通过搜索具有在 progfile/prog 中指定的模式的行来处理输入文件,具体取决于您是否将 -f 选项与 awk 一起使用。并且基于所使用的模式,在输入文件中找到的行上执行关联的操作。我的问题是...在运行 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 行。因此,对带有头文件 test.awk
的文件 #!/usr/bin/env awk -f
有效执行的结果命令行将是 awk -f test.awk
,将 test.awk
视为要执行的脚本文件而不是数据输入文件。
最好的例子:创建一个文件 test
作为唯一内容 #!/bin/rm
,使其可执行(例如 chmod 755
)并尝试通过运行 ./test
来执行它。现在,那个文件去了哪里:)
关于linux - 了解 shebang 行中的 awk -f 选项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34009196/