【问题标题】:zsh: argument list too long: sudozsh:参数列表太长:sudo
【发布时间】:2020-01-01 08:56:56
【问题描述】:

我有一个需要运行的命令,其中一个 args 是逗号分隔的 id 列表。 id 列表超过 50k。我已将 id 列表存储在一个文件中,并以以下方式运行该命令:

sudo ./mycommand --ids `cat /tmp/ids.txt`

但是我得到一个错误zsh: argument list too long: sudo 我相信这是因为内核具有它可以接受的最大参数大小。对我来说,一种选择是手动将文件拆分成更小的部分(因为 id 是用逗号分隔的,所以我不能将其平均拆分),然后每次为每个文件运行命令。

有更好的方法吗?

ids.txt 文件如下所示:

24342,24324234,122,54545,565656,234235

【问题讨论】:

  • mycommand读取文件本身而不是使用命令行。
  • 是的,这是一种选择。我想看看有没有不修改脚本代码的方法。
  • 可能有,但最好是破解脚本。
  • 使用xargs:xargs sudo ./mycommand --ids < /tmp/ids.txt。由于您使用反引号和cat 分割空白,因此xargs 执行相同操作的事实是一个好处。组合参数列表和环境的大小总是有限制的——我相信在类 Unix 系统上通常至少为 128 KiB,并且通常更接近 512 KiB。因此,如果 ID 的长度超过 10 个字符,那么 50k 就太大了。 find 程序还使用find … -exec cmd {} + 表示法自动拆分命令行。
  • @JonathanLeffler 我得到 xargs: argument line too long 我的文件大小为 0.82 MB。 xargs --show-limits 输出:Your environment variables take up 3083 bytes POSIX upper limit on argument length (this system): 2616309 POSIX smallest allowable upper limit on argument length (all systems): 4096 Maximum length of command we could actually use: 2613226 Size of command buffer we are actually using: 131072

标签: shell command-line zsh


【解决方案1】:

将 cmets 转换为半连贯的答案。

文件ids.txt 包含单行逗号分隔值,文件的总大小可能太大而无法作为程序的参数列表。

在许多情况下,使用xargs 是正确的答案,但它依赖于能够将输入拆分为可管理的工作块,并且必须多次运行程序才能完成工作.

在这种情况下,xargs 没有帮助,因为文件的大小和格式。

并没有绝对清楚地说明文件中的所有值都必须在一次命令调用中处理。数字列表是否必须全部位于单个参数中或多个参数是否可以代替也不是绝对清楚的。如果多次调用不是问题,则可以重新格式化文件,以便xargs 将其拆分为可管理的块。如果需要,可以创建一个逗号分隔的参数。

但是,这些选项似乎是不可接受的。在这种情况下,必须有所改变。

  • 如果您必须提供一个对于您的系统来说太大的参数,那么您会被淹没,直到您更改某些东西——无论是系统参数还是您的程序。

更改程序通常比重新配置操作系统更容易,特别是如果您考虑重新配置对操作系统的升级。

值得回顾的一个选项是更改程序以接受文件名而不是命令行上的数字列表:

sudo ./mycommand --ids-list=/tmp/ids.txt

然后程序打开并从文件中读取 ID 号。请注意,这会保留现有的 --ids …comma,separated,list,of,IDs 表示法。 = 的使用是可选的;空格也可以。

确实,许多程序的工作基础是提供给它的参数是要处理的文件名(Unix 过滤程序 - 想想grepsedsortcat,...),所以很简单使用:

sudo ./mycommand /tmp/ids.txt

可能就足够了,您可以通过提供多个名称在一次调用中拥有多个文件:

sudo ./mycommand /tmp/ids1.txt /tmp/ids2.txt /tmp/ids3.txt …

可以依次处理每个文件。这组文件是构成单个批处理操作还是每个文件都是自己的批处理操作,取决于mycommand 真正在做什么。

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2017-11-30
    • 2020-05-09
    • 2014-05-21
    • 2015-04-04
    • 2021-10-26
    • 2014-04-18
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多