通过遵循此answer,我能够在git-bash中全局安装GNU Parallel。
但是,运行parallel-tutorial中提到的示例命令时,
parallel -k echo ::: A B C > abc-file
我不断收到此错误
sh: -c: option requires an argument
sh: -c: option requires an argument
sh: -c: option requires an argument
.
.
.
我在这里做错了什么?
因此,根本原因是,如果命令行太长,CygWin(与GNU / Linux相反)不尊重STDERR的重定向。
GNU Parallel通过二进制搜索长度来找出最长的命令行。这在CygWin上非常慢,因为派生12 MB的命令行非常慢(并且12 MB似乎是我的CygWin版本的限制)。
幸运的是,只做一次。此之后,GNU Parallel将行长缓存在~/.parallel/tmp/HOSTNAME/linelen
中,这就是删除~/.parallel/tmp
时遇到问题的原因。
这也是使用不同版本的方法似乎起作用的原因:您只完成了一次运行,因此就缓存了长度。做到这一点的不是版本更改。
直到我设法让CygWin忽略sh: -c: option requires an argument
,您所要做的就是忽略它并耐心等待。我可能还应该发出一个小警告,让CygWin用户知道他们必须在第一时间耐心等待。
运行:
parallel echo ::: 1
它将吐出sh: -c: option requires an argument
约25次,但这很好。大约需要30秒才能完成。
此后,所有操作都应该很快完成,并且您应该不会看到该错误。
应该在GIT的最新版本中修复:https://savannah.gnu.org/git/?group=parallel
您不是第一个遇到此问题的人,目前我们不知道是什么原因引起的。我可以使用Windows-10机器,但看不到该行为。解决方法似乎是使用旧版本的GNU Parallel。您可以通过确定哪些版本可以提供帮助。如果只有一个版本(请看此处:https://ftpmirror.gnu.org/parallel),则可以运行以下命令:
testone() {
v="$1"
wget -c https://ftpmirror.gnu.org/parallel/parallel-$v.tar.bz2
tar xvf parallel-$v.tar.bz2
cd parallel-$v
src/parallel true ::: 1
}
export -f testone
parallel -k --joblog my.log testone {1}{2}22 ::: {2012..2020} ::: {01..12}
grep -E '\s0\s0\stest' my.log
这将提供所有可用的版本。
将最新版本,以下版本和最新版本(20200322)的parallel -Dall echo ::: foo
输出发布。