【发布时间】: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