Bash:使用xargs从文件读取参数时出现意外的并行行为

时间:2015-06-13 21:47:05

标签: linux bash shell sed

这是对this问题的跟进。

功能

我的系统是运行Ubuntu Desktop的专用服务器,版本12.04(精确)64位,3.14.32-xxxx-std-ipv6-64。发布或内核都不能升级,但我可以安装任何软件包。

问题

上述问题中描述的问题似乎已经解决,但这对我不起作用。我已经安装了最新的lftp和并行软件包,它们似乎能够自行运行。

  • 正常运行lftp
  • 正常运行./job.sh ftp.microsoft.com,但我需要chmod -x脚本
  • 正在运行sed 's/|.*$//' end_unique.txt | xargs parallel -j20 ./job.sh :::不起作用,并以/bin/bash: <server>: command not found.
  • 的形式产生bash错误

为简化起见,我清理了输入文件end_unique.txt,现在每行都有以下格式:

<server>

每行以CRLF结尾,因为它是从Windows服务器导入的。

修改1:

这是job.sh脚本:

#/bin/sh
server="$1"
lftp -e "find .; exit" "$server" >"$server-files.txt"

编辑2:

我拿了文件并对着fromdos运行它。现在它应该是标准的unix格式,每行一个服务器。请记住,文件中的服务器格式可能不同:

ftp.server.com
www.server.com
server.com
123.456.789.190

等。所有这些服务器都是ftp服务器,可由ftp://<serverfromfile>/访问。

1 个答案:

答案 0 :(得分:2)

对于:::parallel需要完成命令行所需的参数列表,以便在命令行中显示,如

parallel -j20 ./job.sh ::: server1 server2 server3

没有:::它会从stdin中读取参数,在这种情况下,它会更好地为我们服务。你可以简单地说

parallel -j20 ./job.sh < end_unique.txt

附录:可能出错的事情

确定两件事:

  1. 您使用的是GNU parallel而不是其他版本(例如来自moreutils的版本),因为只有(据我所知)GNU版本支持读取参数从stdin列出,
  2. GNU并行未配置为禁用GNU扩展。在评论中经过长时间的讨论之后,事实证明它们在Ubuntu 12.04上默认是禁用的,所以在其他地方(尤其是Ubuntu的下游)可能会发现这种情况并不是不可思议的。这样的配置可以隐藏在

    • 环境变量$PARALLEL
    • /etc/parallel/config
    • ~/.parallel/config
  3. 如果您无法使用parallel的GNU版本,并且如果您的参数列表对于shell而言不太长并且其中的任何参数都不包含空格,相同moreutils parallel的内容是

    parallel -j20 job.sh -- $(cat end_unique.txt)
    

    这对OP不起作用,因为该文件包含的服务器数量超过了shell愿意放入命令行的数量,但它可能适用于有类似问题的其他服务器。