2

groovyのように実行したいbashスクリプトがあります

some_shell_script.sh param1 "report_date=`some_function 0 \"%Y%m%d\"`"

そのスクリプトはコマンドラインから正常に実行されますが、Groovyから実行しようとすると

def command = "some_shell_script.sh param1 "report_date=`some_function 0 \"%Y%m%d_%H%M%S\"`""
def sout = new StringBuffer()
def serr = new StringBuffer()
//tried to use here different shells /bin/sh /bin/bash bash 
ProcessBuilder pb = new ProcessBuilder(['sh', '-c',command])
Process proc = pb.start()
proc.consumeProcessOutput(sout, serr)

def status = proc.waitFor()

println 'sout: ' + sout
println 'serr: ' + serr

次のエラーがあります

serr: sh: some_function: command not found

同時に

which some_function

次のような機能定義を返します

some_function ()
{
;some definition here
}

groovyから外部スクリプトを実行すると、親プロセスのコンテキストなしで別のプロセスが開始されるように見えます。親プロセスの関数定義が存在しないことを意味します。

誰もがそのような状況に対処する方法を手がかりを持っていますか?

4

4 に答える 4

2

コマンド定義の二重引用符を一重引用符に置き換える必要があります。

def command = 'some_shell_script.sh param1 "report_date=`some_function 0 "%Y%m%d_%H%M%S"`'

追加:

println command 

正しいコマンドを実行していることを確認します。

また、新しいbashシェルを開き、それsome_functionが定義されていることを確認します。

于 2012-08-07T18:27:36.727 に答える
1

これはパスの問題のようです。スクリプトへのフルパスを入力して、再試行できますか?

于 2012-08-07T17:41:21.320 に答える
1

@Reimeus によって示されているこれらの引用を必ず確認してください。私はそれらについていくつかの疑問を持っていました。

さらに、bash を対話的に実行するときに、、またはこれらのいずれかをソースとするファイルsome_function()で定義できます。スクリプトを実行すると、これは発生しません。(これは、スクリプトを予測どおりに実行するのに適しています。スクリプトをユーザーのログイン環境に依存させることはできません。)~/.bashrc/etc/bash.bashrc

この場合、some_function() を別のファイルに移動し、そのフル パスを BASH_ENV 変数に入れ、スクリプトを処理するときに bash がそれを取得できるようにします。

男バッシュ:

   When  bash  is  started  non-interactively,  to run a shell script, for
   example, it looks for the variable BASH_ENV in the environment, expands
   its  value if it appears there, and uses the expanded value as the name
   of a file to read and execute.  Bash behaves as if the  following  com-
   mand were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
   but  the  value of the PATH variable is not used to search for the file
   name.
   [Manual page bash(1) line 158]
于 2012-08-07T22:30:31.687 に答える
0

免責事項:このソリューションには制限がありシェル サブスクリプト コマンドは展開前に適切にテストする必要があります。ただし、関数がすぐにいくつかの短い結果を提供するなど、マルチスレッドが必要ない場合は、ここで実装した代替手段があります。

たとえば、 の結果がでmycmd設定された環境変数に依存する場合、~/.bashrcその結果を表示できます: (groovy-script/v1.8.1 として試してみました。はい、これはばかげた例であり、リスクが高い可能性があります!)

commands = '''source ~/.bashrc; cd ~/mytest; ./mycmd'''
"bash".execute().with{
  out << commands
  out << ';exit $?\n'
  waitFor()
  [ok:!exitValue(), out:in.text, err:err.text]
}.with{ println ok?out:err }
于 2012-08-08T20:51:58.557 に答える