我写了一个shell脚本来分别处理一堆文件,比如这个
#!/bin/bash
#set parameters (I have many)
...
#find the files and do iteratively
for File in $FileList; do
source MyProcessing.sh
done
MyProcessing.sh
是调用脚本,主脚本中的变量和函数用于调用脚本。
现在我想将我的shell脚本移动到集群,并在迭代中使用qsub
。我试过了
#find the files and do iteratively
for File in $FileList; do
echo "source MyProcessing.sh" | qsub
done
但它不会以这种方式起作用。有人可以帮忙吗?提前谢谢。
答案 0 :(得分:3)
变量和函数是脚本的本地变量。这意味着source MyProcessing.sh
将有效,但bash MyProcessing.sh
不会。第二种语法创建一个子shell,这意味着一个新的Unix进程和Unix进程被隔离。
qsub
也是如此,因为你通过管道调用它:BASH将创建一个新进程qsub
并将stdin设置为source MyProcessing.sh
。只将这23个字节传递给qsub
,而不是其他任何内容。
如果你希望这个工作,那么你将不得不编写一个100%独立于主脚本的新脚本(即它不能使用任何变量或函数)。然后,您必须阅读qsub
的文档以了解如何设置它。通常,这样的工具仅在您在群集的每个节点上分发MyProcessing.sh
的副本后才起作用。
此外,该工具可能不会试图找出脚本需要的其他数据,因此您还必须将文件复制到群集节点(可能将它们放在共享文件系统上)。
答案 1 :(得分:0)
使用:
(set; echo "source MyProcessing.sh") | qsub
您需要在qsub
shell中设置当前变量。