wget和bash错误:bash:第0行:fg:没有作业控制

时间:2015-01-06 18:45:47

标签: linux macos bash shell xargs

我试图通过xargs并行运行一系列命令。我在文件cmd_list.txt中创建了一个以空格分隔的命令列表,然后尝试与6个线程并行运行它们,如下所示:

cat cmd_list.txt | xargs -0 -P 6 -I % bash -c %

但是,我收到以下错误:

bash: line 0: fg: no job control

我已将问题缩小到与命令列表中各个命令的长度相关的范围。这是一个用于下载图像的人工长命令示例:

mkdir a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8
wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://d4u3lqifjlxra.cloudfront.net/uploads/example/file/48/accordion.jpg

单独运行wget命令,没有文件列表且没有xargs,运行正常。但是,在bash命令提示符下运行此命令(同样,没有文件列表)将失败并显示no job control error

echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://d4u3lqifjlxra.cloudfront.net/uploads/example/file/48/accordion.jpg" | xargs -I % bash -c %

如果我省略长文件夹名称并因此缩短命令,它可以正常工作:

echo "wget --no-check-certificate --no-verbose -O /tmp/blah.jpg http://d4u3lqifjlxra.cloudfront.net/uploads/example/file/48/accordion.jpg" | xargs -I % bash -c %

xargs-s(大小)参数,可以更改命令行长度的最大大小,但我尝试将其增加到荒谬的大小(例如,16000)而没有任何影响。我认为问题可能与传递给bash -c的字符串的长度有关,但是以下命令也可以顺利运行:

bash -c "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://d4u3lqifjlxra.cloudfront.net/uploads/example/file/48/accordion.jpg"

我知道还有其他选项可以并行运行命令,例如parallel命令(https://stackoverflow.com/a/6497852/1410871),但我仍然对修复我的设置或至少计算很感兴趣在哪里出错了。

我在Mac OS X 10.10.1(约塞米蒂)上。

2 个答案:

答案 0 :(得分:2)

看起来解决方案是避免-I的{​​{1}}参数,对于OS X xargs man page,它对替换字符串有255个字节的限制。相反,xargs参数可用,没有255字节的限制。

所以我的命令看起来像:

-J

但是,在上面的命令中,只有第一个空格之前的替换字符串部分被传递给bash,所以bash尝试执行:

echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://d4u3lqifjlxra.cloudfront.net/uploads/example/file/48/accordion.jpg" | xargs -J % bash -c %

显然会导致错误。我的解决方案是确保wget 使用xargs参数将命令解释为空分隔而不是空格分隔,如下所示:

-0

最后,这有效!

感谢@CharlesDuffy提供了大部分见解。并且不要感谢我的OS X版echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://d4u3lqifjlxra.cloudfront.net/uploads/example/file/48/accordion.jpg" | xargs -0 -J % bash -c % ,因为它对超过255字节限制的替换字符串的处理能力很差。

答案 1 :(得分:1)

我怀疑它是百分号,而你的顶级外壳抱怨。

  

cat cmd_list.txt | xargs -0 -P 6 -I%bash -c%

百分比是作业控制的元字符。 " fg%2",例如"杀死%4"。

尝试使用反斜杠转义百分比,向顶部shell发出信号,告知它不应该尝试解释百分比,并且应该将xargs转换为字面百分比字符。

  

cat cmd_list.txt | xargs -0 -P 6 -I \%bash -c \%