【问题标题】:Argument list too long for input参数列表太长,无法输入
【发布时间】:2014-08-24 23:36:21
【问题描述】:

我正在执行一个 shell 脚本,在较高级别上它从 csv 读取记录并因此执行一些数据库操作。 我通过手动运行脚本进行了分析。对于文件中少于 900 条记录,它运行良好,但对于超过 900 条记录它给出了错误。下面是我一段时间后得到的错误截图:

脚本的一部分正在逐个选择记录 1:

您能否说明为什么会发生这种情况?当用户遇到该错误时,我已经阅读了类似的主题,但无法将它们与我的场景联系起来。

干杯

【问题讨论】:

  • 我认为您没有发布错误所在的第 109-111 行。
  • 您能否说明为什么会这样? ...因为参数列表太长。记录被传递给 shell,shell 对参数列表长度有限制。
  • 尝试将find *XYZ*.csv > list_of_files.txt 替换为find . -name "*XYZ*.csv" > list_of_files.txt 以避免通配符。
  • 顺便说一句,很明显,批处理中使用的变量之一在某处被设置为某个荒谬的长值(> 250k len),可能是由于脚本本身的质量低。我建议将 $v_DateTime 视为罪魁祸首。
  • set -x 放在脚本的开头。然后它会向您展示它在做什么,所有变量都已展开。

标签: bash shell unix


【解决方案1】:

我之前遇到过这个问题,而且很容易复制:

unset a; export a=$(perl -e 'print "a"x(1024*64)'); whoami
tiago

unset a; export a=$(perl -e 'print "a"x(1024*128)'); whoami
bash: /usr/bin/whoami: Argument list too long

perl -e 'print "a"x(1024*64)' | wc  -c
65536

perl -e 'print "a"x(1024*128)' | wc  -c
131072

所以 65536 和 131072 字节之间的东西会中断,当我遇到这个问题而不是导出我正在打印的值并使用管道处理数据时。另一种方法是使用文件。

你可以找到很好的实验:What is the maximum size of an environment variable value?

【讨论】:

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