0

このように、一連のファイルを個別に処理するシェルスクリプトを作成しました

#!/bin/bash

#set parameters (I have many)
...

#find the files and do iteratively
for File in $FileList; do
    source MyProcessing.sh
done

MyProcessing.shは呼び出しスクリプトであり、メイン スクリプトの変数と関数は呼び出しスクリプトで使用されます。

qsubここで、シェル スクリプトをクラスターに移動し、反復で使用したいと思います。私は試した

#find the files and do iteratively
for File in $FileList; do
    echo "source MyProcessing.sh" | qsub
done

しかし、この方法では機能しません。誰でも助けることができますか?前もって感謝します。

4

2 に答える 2

3

変数と関数はスクリプトに対してローカルです。これは、機能するsource MyProcessing.shが機能しbash MyProcessing.shないことを意味します。2 番目の構文はサブシェルを作成します。これは、新しい Unix プロセスと Unix プロセスが分離されることを意味します。

パイプ経由で呼び出すため、同じことが当てはまりqsubます。BASH は新しいプロセスを作成しqsub、stdin を に設定しsource MyProcessing.shます。これは、これらの 23 バイトを に渡すだけで、他にはqsub何も渡しません。

これを機能させたい場合は、メイン スクリプトから 100% 独立した新しいスクリプトを作成する必要があります (つまり、変数や関数を使用してはなりません)。次に、のドキュメントを読んで、qsubセットアップ方法を確認する必要があります。通常、そのようなツールMyProcessing.shは、クラスターのすべてのノードに のコピーを配布した後にのみ機能します。

また、ツールはおそらくスクリプトが必要とする他のデータを把握しようとしないため、ファイルをクラスター ノードにもコピーする必要があります (おそらく共有ファイル システムに配置することによって)。

于 2013-01-25T15:21:06.490 に答える
0

使用する:

(set; echo "source MyProcessing.sh") | qsub

qsubシェルで現在の変数を設定する必要があります。

于 2013-01-26T06:19:20.057 に答える