【发布时间】:2015-11-30 22:27:03
【问题描述】:
我正在阅读某人的 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 选项,它就无法正确解析参数。但是为什么呢?
【问题讨论】: