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 の 3 つの可能な組み合わせ値をすべて取得する方法はありますか?

- 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 を取得することは困難です。

ルアコード -

-- 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. スペクトルの一方の端では、変数の実際の値を除いてファイルは決して変更されません (したがって、すべての分岐とセットと setenv は同じ場所に同じ順序で残り、文字列リテラルのみが変更されます)。
  2. もう一方の端では、ファイルのどこかに PATH が設定されていることを除いて、ファイルが完全に変更される可能性があります。

#1 の場合、Lua のパターン マッチング機能を使用して、関心のあるすべてのセットを簡単に見つけるapp_buildことができ、そこから PATH の 3 つの値を特定できます (構造が変更されないため、他の変数を解析する必要はありません)。 Lua コードのロジックで想定できます)。

#2 の場合、次の 2 つのオプションがあります。

  1. スクリプト言語 (bash?) 用のパーサーを作成します。そのために Lua の LPEG ライブラリを使用できますが、それはかなり困難な作業であり、実現可能性は低いでしょう。
  2. Lua を使用して bash ファイルを新しいファイルにコピーしますが、いくつかの bash コマンドを追加して PATH を stdout に出力してから、bash を使用io.popenして一時スクリプトを実行し、その出力をキャプチャします。次に、Lua のパターン マッチング機能を使用して PATH の値を見つけます。Lua スクリプトはio.popen、3 つのオプションごとに 1 回ずつ、これを 3 回実行します。これは、スクリプトがプログラミング環境内からしか機能しないというスクリプト内のコメントに基づいて機能する可能性は低いです。

したがって、実際には、#2 の場合は SOL である可能性が高く、#1 の場合は正しい軌道に乗っています。後者の場合で、すべての変数を取得するのに問題がある場合は、コメントを投稿してください。回答に例を追加します。

于 2014-07-04T01:27:43.137 に答える