1

我试图在读取 lua 脚本中的模块文件时读取模块文件中给出的 PATH 变量的值。我不确定这是否可以使用 lua 中的某些函数来完成,因为我对 lua 还很陌生。

模块文件 (netcdf) 下面仅给出了模块文件的一部分 -

set application netcdf
set version 4.1.1

set machine kgb
set app_base /sw/$machine/$application/$version

module-whatis "Sets up environment to use serial netcdf"
if [ module-info mode whatis ] {
  break
}


  #vvvvv If if not a library, remove this part vvvvv
  if [ is-loaded intel ] {
    set app_build "centos6.2_intel12"
  } elseif [ is-loaded gcc ] {
    set app_build "centos6.2_gnu4.4.6"
    break
  } elseif [ is-loaded pgi ] {
    set app_build "centos6.2_pgi12.3"
    break
  } else {
    puts stderr "You must have a programming environment loaded to use this module"
    break
  }
  #^^^^^ If if not a library, remove this part ^^^^^

  # This assumes something like --prefix=$SW_BLDDIR
  set app_path $app_base/$app_build

  setenv NETCDF_DIR "$app_path"
  setenv NETCDF_INCLUDE "$app_path/include"
  setenv NETCDF_LIB "$app_path/lib"
  #setenv NETCDF_LINK "-I${FOO_INCLUDE} -L${FOO_LIB} -lfoo"

  prepend-path PATH             "$app_path/bin"
  prepend-path LD_LIBRARY_PATH  "$app_path/lib"

我正在阅读这个文件,有没有什么方法可以得到 PATH 的所有三个可能的组合值,无论用户/系统的环境如何,即

- PATH = /sw/kgb/netcdf/4.1.1/centos6.2_intel12/bin
- PATH = /sw/kgb/netcdf/4.1.1/centos6.2_gnu4.4.6/bin
- PATH = /sw/kgb/netcdf/4.1.1/centos6.2_pgi12.3/bin

我编写的代码仅读取该行,但很难排列变量中的值并获得所需的 PATH。

Lua 代码 -

-- reading module file 
local mfile = v.file
local lines = lines_from(mfile)

-- print all line numbers and their contents 
for k ,v in pairs(lines)do
   print('line['..k..']',v)
end

-- see if file exists 
function file_exists(file)
   local f = io.open(file,"rb")
   if f then f:close() end
   return f~= nil
end

-- get all lines from a file, returns an empty 
-- list/table if the file does not exists
function lines_from(file)
   if not file_exists(file) then return {} end
   local lines = {} 
   for line in io.lines(file) do
     if (string.match(line, 'set') or string.match(line,'prepend'))then  
       lines[#lines+1] = line
     end
   end
   return lines
end 

我得到的输出只是显示了我需要的感兴趣的行,但是获得 PATH 的所有可能值仍然遥不可及,任何帮助将不胜感激!

-K

4

1 回答 1

0

真的取决于你对非 Lua 文件了解多少:

  1. 在频谱的一端,除了变量的实际值之外,文件永远不会改变(因此所有分支和集合以及 setenvs 以相同的顺序保持在同一位置,只是字符串文字发生了变化);
  2. 在另一端,文件可以完全改变,除了在文件中的某个地方设置了 PATH。

对于 #1 案例,您可以很容易地使用 Lua 的模式匹配功能来查找所有感兴趣的集合,app_build并从中确定 PATH 的 3 个值(无需解析其他变量,因为结构不会改变您可以在你的 Lua 代码逻辑中假设它)。

对于 #2 案例,您有两种选择:

  1. 您为脚本语言(bash?)构建了一个解析器:您可以为此使用 Lua 的 LPEG 库,但这是一项非常艰巨的工作,对您来说不太可能。
  2. 您使用 Lua 将 bash 文件复制到一个新文件,但是您附加了一些 bash 命令以将 PATH 输出到 stdout,然后您使用io.popenbash 运行临时脚本并捕获其输出。然后使用 Lua 的模式匹配功能来查找 PATH 的值。您的 Lua 脚本会执行此操作io.popen3 次,三个选项中的每个选项执行一次。这不太可能基于脚本中的注释,即脚本只能在编程环境中工作。

所以在实践中#2 你很可能是 SOL,而#1 你走在正确的轨道上。如果后者是您的情况,但您无法获取所有变量,请发表评论,我将在我的答案中添加一个示例。

于 2014-07-04T01:27:43.137 回答