【问题标题】:Full path to an awk script from within the script itself从脚本本身到 awk 脚本的完整路径
【发布时间】:2014-06-26 01:21:08
【问题描述】:

我有一个 AWK 脚本,即 linux 中可执行的 ascii 文件,其中第一行是:

#!/usr/bin/awk -f 

如果我在同一个目录中,我会这样执行 myscript:

> ./myscript  afile

或者像这样,如果我在不同的目录中:

> pwd
/some_weird_path
> /full_path/myscript   afile

如何从 AWK 脚本本身访问“/full_path/”?我尝试了以下方法但没有成功:

ARGV[0]  => /usr/bin/awk
ARGV[1]  => afile
ENVIRON["PWD"] => some_weird_path

想法?

【问题讨论】:

  • ENVIRON["PWD"] 只会列出您启动脚本的路径。如果不对getline var 捕获的操作系统实用程序进行一些巧妙的调用,我认为您无法获得所需的东西。或者记忆力更好的人会发布duplicate-question 回复(如果你幸运的话;-))。祝你好运。

标签: macos awk path


【解决方案1】:

这很难看,但似乎可以在 linux 上与 gnu awk 一起使用。

BEGIN {
        getline cmdline <("/proc/"PROCINFO["pid"]"/cmdline")
        nf=split(cmdline,fields,/\0/)
        print fields[3]
      }

这更难看,但它应该适用于任何具有ps 实现的系统,只要 awk 的路径和脚本的路径都不包含空格字符:

BEGIN {
        "ps -p "PROCINFO["pid"]" -ocommand=" | getline cmdline
        nf=split(cmdline,fields," ")
        print fields[3]
      }

YMMV.

【讨论】:

  • 不幸的是,我在一个没有 /proc 文件夹的基于 BSD 的系统上。
  • @user1846135:那么,你为什么将你的问题标记为linux? -- 添加了一些可能有用的东西。
  • 抱歉,我更新了标签。我在基于 BSD 的 OSX 上。我尝试了您的建议,但 PROCINFO["pid"] 没有返回任何内容,因此出现错误:ps: option requires an argument -- p
  • 想必你的awk不是gnu awk。对不起。
【解决方案2】:

我想出了怎么做。根据 Rich 的建议,这在 OSX 上对我不起作用,我在“/usr/bin/awk”上进行了正则表达式,以找出哪一行对应于实际命令。

BEGIN {
   while ( ( "ps -ocommand=" | getline pslines ) > 0 ) {
      if ( pslines ~ "/usr/bin/awk -f" ) { 
          split(pslines, tmp);
      }
   }
   print tmp[3]
}

它应该可以在任何系统中工作(未经测试)...至少只要相同的用户 ID 没有同时运行另一个 awk 副本。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 2021-10-31
    • 2011-11-28
    • 2015-10-07
    • 2016-05-22
    • 2011-06-14
    • 2014-09-04
    • 2016-12-29
    相关资源
    最近更新 更多