gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:30 26 4
gpt4 key购买 nike

上一个

这是 this 问题的后续。

规范

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

问题

上面问题中描述的问题似乎已经解决,但这对我不起作用。我已经安装了最新的 lftp 和 parallel 软件包,它们似乎可以正常工作。

  • 运行 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>/ 访问。

最佳答案

对于 :::parallel 期望完成将要运行的命令所需的参数列表出现在命令行中,如

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

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

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

附录:可能出错的地方

确定两件事:

  1. 您使用的是 GNU parallel 而不是其他版本(例如来自 moreutils 的版本),因为只有(据我所知)GNU 版本支持从标准输入读取参数列表,以及
  2. GNU parallel 未配置为禁用 GNU 扩展。事实证明,在评论中进行了长时间的讨论后,它们在 Ubuntu 12.04 上默认被禁用,因此在其他地方(特别是 Ubuntu 的下游)可能会发现这种事情并不是不可想象的。这样的配置可以隐藏在

    • 环境变量$PARALLEL,
    • /etc/parallel/config,或者
    • ~/.parallel/config

如果 parallel 的 GNU 版本对您不可用,并且如果您的参数列表对于 shell 来说不是太长并且其中的参数都不包含空格, 与 moreutils parallel 相同的是

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

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

关于linux - Bash:使用 xargs 从文件读取参数时出现意外的并行行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com