GNU Parallel和Bash功能:如何从手册中运行简单的例子

前端之家收集整理的这篇文章主要介绍了GNU Parallel和Bash功能:如何从手册中运行简单的例子前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
伙计们,

我正在尝试学习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.

ETA2:注意,我可以在脚本中调用“doit 1”,并且这样做.所以功能是有效的,它只是不…导出?

您不能从定义它的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的用户界面偏好,而不是改变程序的行为.

猜你在找的Bash相关文章