伙计们,
我正在尝试学习GNU Parallel,因为我有一种情况,我认为我可以轻松地并行化一个bash功能.所以在试图学习的时候,我去了GNU Parallel manual那里有an example …但我甚至不能让它工作!以机智:
(232) $bash --version GNU bash,version 4.1.2(1)-release (x86_64-redhat-linux-gnu) Copyright (C) 2009 Free Software Foundation,Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY,to the extent permitted by law. (233) $cat tpar.bash #!/bin/bash echo `which parallel` doit() { echo Doing it for $1 sleep 2 echo Done with $1 } export -f doit parallel doit ::: 1 2 3 doubleit() { echo Doing it for $1 $2 sleep 2 echo Done with $1 $2 } export -f doubleit parallel doubleit ::: 1 2 3 ::: a b (234) $bash tpar.bash /home/mathomp4/bin/parallel doit: Command not found. doit: Command not found. doit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found.
你可以看到,我甚至不能得到一个简单的例子来运行.因此,我可能正在做一些令人惊讶的愚蠢和基本的事情,但我感到失落.
ETA:由评论者(chmod x,set -vx)建议的:
(27) $./tpar.bash echo `which parallel` which parallel ++ which parallel + echo /home/mathomp4/bin/parallel /home/mathomp4/bin/parallel doit() { echo Doing it for $1 sleep 2 echo Done with $1 } export -f doit + export -f doit parallel doit ::: 1 2 3 + parallel doit ::: 1 2 3 doit: Command not found. doit: Command not found. doit: Command not found. doubleit() { echo Doing it for $1 $2 sleep 2 echo Done with $1 $2 } export -f doubleit + export -f doubleit parallel doubleit ::: 1 2 3 ::: a b + parallel doubleit ::: 1 2 3 ::: a b doubleit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found. doubleit: Command not found.
您不能从定义它的shell外部调用shell函数. shell函数是shell内的一个概念.并行命令本身无法访问它.
在bash中调用export -f doit可以通过环境导出函数,以便它被子进程所接受.但只有bash了解bash功能.一个(大)*小孩bash进程可以调用它,但不能调用其他程序,例如不是其他shell.
通过消息“命令未找到”,您的首选shell似乎是(t)csh.你需要告诉parallel来调用bash.并行调用由SHELL环境变量¹表示的shell,因此将其设置为指向bash.
export SHELL=$(type -p bash) doit () { … } export -f doit parallel doit ::: 1 2 3
如果您只想为执行并行命令设置SHELL,而不是为脚本的其余部分设置SHELL:
doit () { … } export -f doit SHELL=$(type -p bash) parallel doit ::: 1 2 3
我不知道如何处理远程作业,您可能需要传递--env=SHELL
除了–env = doit(请注意,这假设到bash的路径是一样的).
是的,这个奇怪性应该在手册中更突出.在command
argument的描述中有一个简要说明,但它不是很明确(应该解释说,命令字作为分隔符连接到一个空格,然后传递给$SHELL -c),而SHELL甚至不是列在environment variables部分. (我鼓励你把这个报告为bug;我没有这样做,因为我几乎没有使用过这个程序.)
¹这是坏的设计,因为SHELL应该指示交互式命令行shell的用户界面偏好,而不是改变程序的行为.