我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
说它是nixos 19.09上的awk版本5.0.1。
我需要使用/usr/bin/env
,因为nixos文件没有遵循传统的FHS目录层次结构。
我怀疑我缺少明显的东西,但是看awk教程和SO问题目前还没有给我任何线索。
编辑:我用来启动脚本的命令行
ls -l | . testawk.sh
采购与执行不同。具体来说,采购期望可以在当前shell中执行的命令列表。以下是bash的help .
:
。:。文件名[参数]
从当前Shell中的文件执行命令。
在当前Shell中从FILENAME读取并执行命令。$ PATH中的条目用于查找包含FILENAME的目录。如果提供了任何ARGUMENTS,则它们将在执行FILENAME时成为位置参数。
因此,当您运行时. file
,您的外壳程序将读取文件并执行找到的每个命令。但是,这意味着shebang行将被忽略,并被视为常规注释。因此,您的shell(而不是awk)正在尝试执行BEGIN
。
为避免这种情况,您应该执行脚本而不是采购脚本。如果由于某种原因而只需要来源,则在脚本中编写一个awk命令:
awk '
BEGIN { }
{ }
END { }'
那你就可以
ls | . ./a.awk
虽然我真的无法想到您为什么会想要。
顺便说一句,您应该知道默认情况下.
(或source
bash中的)会在您$PATH
的文件中查找文件名。因此,如果您运行. foo
,并且foo
在当前目录中有一个文件,并且foo
在您的中的任何目录中都有一个文件$PATH
,那么将要获取的文件是您目录中的文件,$PATH
而不是当前目录中的文件。为避免这种情况,请在采购时始终使用完整路径:. ./foo
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句