linux - wget 和 bash 错误 : bash: line 0: fg: no job control

标签 linux macos bash shell xargs

我正在尝试通过 xargs 并行运行一系列命令。我在文件 cmd_list.txt 中创建了一个以 null 分隔的命令列表,然后尝试使用 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 (size) 参数可以改变命令行长度的最大大小,但我试着把它增加到荒谬的大小(例如,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 (Yosemite) 上。

最佳答案

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

所以我的命令看起来像:

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 %

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

wget

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

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 %

最后,这成功了!

感谢@CharlesDuffy 提供了大部分见解。不感谢我的 OS X 版本的 xargs,因为它对超过 255 字节限制的替换字符串的处理不佳。

关于linux - wget 和 bash 错误 : bash: line 0: fg: no job control,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805096/

相关文章:

Linux : power fault input?

linux - 从两个中指定命令文件位置

android - 如何在 Mac 上运行 AVD 管理器

bash - 使用 Bash 在名称中间重命名多个文件的一小部分?

xml - Bash 将 XML 解析为数组

java - JAXB 解码返回 null 属性命令行

c# - 用于 Linux 的单声道 VLC API

macos - Mac 上的 Google Chrome 开发者工具键盘快捷键自定义

c++ - 在 Yosemite 上安装 wx-widgets 让我发疯

bash - 如何制作一个 cronjobbable 脚本来计时上传?