可执行的 awk 脚本输出其名称
Executable awk script to output its name
我有一个简单的可执行 awk 脚本,我试图让它说出自己的名字:
$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
print "Hi, I'm " ARGV[0]
}
执行时:
$ chmod u+x script.awk
$ ./script.awk
Hi, I'm awk
预期(好吧,无论如何都希望)输出将是 Hi, I'm script.awk
。除了将其转换为 shell 脚本之外,有没有办法实现这一点,例如:
$ cat script.sh
#!/bin/bash
read -d '' script <<EOF
BEGIN {
print "Hi, I'm " var
}
EOF
awk -v var=[=12=] "$script"
aaand,操作:
$ ./script.sh
Hi, I'm ./script.sh
在bash或zsh中,你可以通过ENVIRON["_"]
:
使用shell环境变量$_
$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
print "Hi, I'm " ENVIRON["_"]
}
$ chmod u+x script.awk
$ ./script.awk
Hi, I'm /tmp/./script.awk
ENVIRON
数组是 POSIX 标准中定义的 awk special variable,因此它应该可以在任何版本的 awk 中使用,但不同的 shells 实现$_
不同,因此 只有从 bash 或 zsh 调用它时才可靠。
这将 不 在 dash 中工作(commonly 安装为 /bin/sh
)因为 dash 分配了 previous命令到 $_
(如果这是第一个命令,它将改为分配给自己)。
Korn Shell(至少是 ksh93)将 shell 的 PID(用星号包围)作为值的前缀,如 *12345*./script.awk
,因此需要稍作修改。
此版本将在 bash、zsh 和 ksh 中运行:
#!/usr/bin/awk -f
BEGIN {
self = ENVIRON["_"]
sub(/^\*[0-9]+\*/, "", self)
print "Hi, I'm " self
}
我有一个简单的可执行 awk 脚本,我试图让它说出自己的名字:
$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
print "Hi, I'm " ARGV[0]
}
执行时:
$ chmod u+x script.awk
$ ./script.awk
Hi, I'm awk
预期(好吧,无论如何都希望)输出将是 Hi, I'm script.awk
。除了将其转换为 shell 脚本之外,有没有办法实现这一点,例如:
$ cat script.sh
#!/bin/bash
read -d '' script <<EOF
BEGIN {
print "Hi, I'm " var
}
EOF
awk -v var=[=12=] "$script"
aaand,操作:
$ ./script.sh
Hi, I'm ./script.sh
在bash或zsh中,你可以通过ENVIRON["_"]
:
$_
$ cat script.awk
#!/usr/bin/awk -f
BEGIN {
print "Hi, I'm " ENVIRON["_"]
}
$ chmod u+x script.awk
$ ./script.awk
Hi, I'm /tmp/./script.awk
ENVIRON
数组是 POSIX 标准中定义的 awk special variable,因此它应该可以在任何版本的 awk 中使用,但不同的 shells 实现$_
不同,因此 只有从 bash 或 zsh 调用它时才可靠。
这将 不 在 dash 中工作(commonly 安装为 /bin/sh
)因为 dash 分配了 previous命令到 $_
(如果这是第一个命令,它将改为分配给自己)。
Korn Shell(至少是 ksh93)将 shell 的 PID(用星号包围)作为值的前缀,如 *12345*./script.awk
,因此需要稍作修改。
此版本将在 bash、zsh 和 ksh 中运行:
#!/usr/bin/awk -f
BEGIN {
self = ENVIRON["_"]
sub(/^\*[0-9]+\*/, "", self)
print "Hi, I'm " self
}