【发布时间】:2019-04-16 20:44:18
【问题描述】:
Gawk 5.0.0 于 2019 年 4 月 12 日发布。通过the announcement 我发现了这个:
从 4.2.1 更改为 5.0.0
(...) 11. 命名空间已经实现!请参阅手册。这样做的一个后果是
-i包含的文件、-f读取的文件和命令行程序段都必须是自包含的句法单元。例如,你不能再做这样的事情:gawk -e 'BEGIN {' -e 'print "hello" }'
我对这种不再受支持的行为感到好奇,但不幸的是,我的 Gawk 4.1.3 并没有提供太多输出:
$ gawk -e 'BEGIN {' -e 'print "hello" }'
gawk: cmd. line:1: BEGIN {
gawk: cmd. line:1: ^ unexpected newline or end of string
根据我在 GAWK 4.2 手册中看到的,-e 选项已被标记为有问题:
GNU Awk User's Guide, on Options
-e 程序文本
--source程序文本在程序文本中提供程序源代码。此选项允许您将文件中的源代码与您在命令行中输入的源代码混合。当您有想要从命令行程序使用的库函数时,这尤其有用(请参阅 AWKPATH 变量)。
请注意,gawk 将每个字符串视为以换行符结尾(即使不是)。这使得构建整个程序更容易。
注意:目前,没有要求每个程序文本都是完整的句法单元。即,以下当前有效:
$ gawk -e 'BEGIN { a = 5 ;' -e 'print a }' -| 5但是,这在未来可能会发生变化,因此依赖此功能并不是一个好主意。
但是,这在我的控制台中再次失败:
$ gawk -e 'BEGIN {a=5; ' -e 'print a }'
gawk: cmd. line:1: BEGIN {a=5;
gawk: cmd. line:1: ^ unexpected newline or end of string
那么gawk -e 'BEGIN {' -e 'print "hello" }' 在 Gawk
【问题讨论】:
-
我已经用 4.2.1 对此进行了测试,它按预期工作。由换行符分隔的所有
-e字符串的简单串联。它不适用于 4.0.2 -
@kvantour 啊,对,然后 Ed 的回答很到位。感谢您使用 Gawk 4.2 进行检查!
-
我正在挖掘代码以查看可能发生的变化,但我找不到。
-
@kvantour 确实如此。浏览Gawk 4.2.0 announcement 我找不到任何对
e的引用。 -
@kvantour 我找到了docs of Gawk 4.1,我看到
--source只有第一段,所以这部分是新的:请注意,gawk 将每个字符串视为以一个结尾换行符(即使没有)。这使得构建整个程序更容易。
标签: awk namespaces gnu