微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我试图通过xargs并行运行一系列命令。 我在文件cmd_list.txt创build了一个以空分隔的命令列表,然后试图按如下方式与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://img.zgserver.com/linux/accordion.jpg

只要自己运行wget命令,没有文件列表和没有xargs ,工作正常。 但是,在bash命令提示符下运行此命令(再次,没有文件列表)失败,并出现no job control error :

在命令不执行

获取目录中的最新文件

sh中的“&>>”在Ubuntu 16.04.2和Fedora 24中performance方式各不相同

在特定的时间运行一个命令

如何在bash中绑定一个sigkill的密钥?

echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg" | xargs -I % bash -c %

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

echo "wget --no-check-certificate --no-verbose -O /tmp/blah.jpg http://img.zgserver.com/linux/accordion.jpg" | xargs -I % bash -c %

xargs有一个-s (size)参数,可以改变命令行长度的最大值,但我试图将其增加到荒谬的大小(例如16000),没有任何影响。 我认为这个问题可能与传递给bash -c的string的长度有关,但是下面的命令也没有问题:

bash -c "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/accordion.jpg"

我知道有其他选项可以并行运行命令,比如parallel命令( https://stackoverflow.com/a/6497852/1410871 ),但是我仍然对修复我的设置非常感兴趣,或者至less弄清楚了哪里出问题了

我在Mac OS X 10.10.1(优胜美地)。

具有多个参数的xargs

Libpurple不从bash工作

Linuxfind具有相似名称文件,并移动到新目录

如果发现有问题,只能发送电子邮件

bash:将数据导入exec'd命令

看起来解决方法是避免xargs的-I参数,根据OS X xargs手册页 ,对替换字符串的限制是255字节。 相反, -J参数可用,它不具有255字节的限制。

所以我的命令看起来像:

echo "wget --no-check-certificate --no-verbose -O a-very-long-folder-de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8de090952623b4865c2c34bd6330f8a423ed05ed8/blah.jpg http://img.zgserver.com/linux/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://img.zgserver.com/linux/accordion.jpg" | xargs -0 -J % bash -c %

最后,这个作品!

感谢@CharlesDuffy提供了这个见解的大部分内容。 而且不用感谢我的OS X版本的xargs因为它处理超过255字节限制的替换字符串。

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

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

百分比是作业控制的元字符。 “fg%2”,例如“kill%4”。

尝试使用反斜杠转义百分比,告诉上层shell不应该尝试解释百分比,xargs应该是一个字面百分比字符。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐