wget and bash error: bash: line 0: fg: no job control
wget and bash error: bash: line 0: fg: no job control
我正在尝试通过 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
(大小)参数,可以更改命令行长度的最大大小,但我尝试将其增加到荒谬的大小(例如 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
命令 (),但我仍然非常想修复我的设置或至少弄清楚出问题了。
我在 Mac OS X 10.10.1(优胜美地)。
我怀疑是百分号,你的顶部 shell 抱怨。
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 \%
看起来解决方案是避免 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 字节限制的替换字符串的处理不佳。
我正在尝试通过 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
(大小)参数,可以更改命令行长度的最大大小,但我尝试将其增加到荒谬的大小(例如 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
命令 (),但我仍然非常想修复我的设置或至少弄清楚出问题了。
我在 Mac OS X 10.10.1(优胜美地)。
我怀疑是百分号,你的顶部 shell 抱怨。
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 \%
看起来解决方案是避免 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 字节限制的替换字符串的处理不佳。