尝试在lua中读取模块文件时从模块文件中获取PATH变量的值

时间:2014-07-03 16:02:52

标签: lua

我试图在读取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 Code -

-- 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

1 个答案:

答案 0 :(得分:0)

真正取决于您对非Lua文件的了解程度:

  1. 在频谱的一端,文件永远不会改变,除了变量的实际值(所以所有分支和集合和setenvs以相同的顺序保持在同一个地方,只是字符串文字改变);
  2. 在另一端,文件可以完全改变,除了文件中某处设置了PATH。
  3. 对于#1案例,您可以非常轻松地使用Lua的模式匹配功能来查找app_build所有感兴趣的集合,并从中可以确定PATH的3个值(无需解析对于其他变量,因为结构没有改变,你可以在你的Lua代码逻辑中假设它。

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

    1. 你为脚本语言构建一个解析器(bash?):你可以使用Lua的LPEG库,但这是一个相当陡峭的努力,对你来说不太可行。
    2. 您使用Lua将bash文件复制到新文件,但是您附加了一些bash命令以将PATH输出到stdout,然后使用io.popen使用bash运行临时脚本并捕获其输出。然后使用Lua的模式匹配功能来查找PATH的值。您的Lua脚本将执行此操作io.popen 3次,对于3个选项中的每一个都执行一次。根据脚本中的注释,脚本只能在编程环境中工作,这可能不起作用。
    3. 所以在#2的练习中,你可能是SOL,对于#1,你是在正确的轨道上。如果后者是你的情况,但你在获取所有变量时遇到问题,请发表评论,我会在答案中添加一个例子。