"参数列表太长"只有2个参数?

Zed*_*Zed 7 linux bash

我正在调试其他人的代码,如果我试图故意编写代码,我会遇到一些我不知道如何生成的情况.它来自一个非常大的Bash脚本,由CentOS 6盒子上的Bash 4.1.2运行.虽然整个程序是巨大的,但错误始终出现在以下函数中:

get_las() {
    echo "Getting LAS..."
    pushd ${ferret_workdir} >& /dev/null
    #Download:
    if [ ! -e ${las_dist_file} ] || ((force_install)) ; then
        echo "Don't see LAS tar file ${las_dist_file}"
        echo "Downloading LAS from ${las_dist_file} -to-> $(pwd)/${las_dist_file}"

        echo "wget -O '${las_dist_file}' '${las_tar_url}'"
        wget -O "${las_dist_file}" "${las_tar_url}"
        [ $? != 0 ] && echo " ERROR: Could not download LAS:${las_dist_file}" && popd >/dev/null && checked_done 1
    fi
    popd >& /dev/null
    return 0
}
Run Code Online (Sandbox Code Playgroud)

如果我允许脚本在原始环境中从头开始运行,当到达此部分时,它将吐出以下错误并死掉:

Don't see LAS tar file las-esg-v7.3.9.tar.gz
Downloading LAS from las-esg-v7.3.9.tar.gz -to-> /usr/local/src/esgf/workbench/esg/ferret/7.3.9/las-esg-v7.3.9.tar.gz
wget -O 'las-esg-v7.3.9.tar.gz' 'ftp://ftp.pmel.noaa.gov/pub/las/las-esg-v7.3.9.tar.gz'
/usr/local/bin/esg-product-server: line 428: /usr/bin/wget: Argument list too long
 ERROR: Could not download LAS:las-esg-v7.3.9.tar.gz
Run Code Online (Sandbox Code Playgroud)

请注意,我甚至在那里有一个调试回声来证明参数只是两个小字符串.

如果我让程序错误在上面的点,然后立即从相同的期望脚本重新运行它,唯一的变化是它已经完成了这个之前的所有阶段并且正在检测并跳过它们,这部分将正常执行,没有错误.这种行为在我的测试盒上是100%可重现的 - 如果我清除了运行代码的所有痕迹,此后第一次运行就会爆炸,随后的运行会很好.

我能想到的唯一一件事就是我在Bash本身遇到了一些模糊的错误,它以某种方式导致它无形地泄漏MAX_ARG_PAGES内存,但我想不出任何理论上的方法来实现这一点,所以我是问这里

到底发生了什么以及如何让它停止(没有像重新编译内核那样的极端措施只是为了抛出更多的内存)?

更新:要回答评论中的问题,第428行是

wget -O "${las_dist_file}" "${las_tar_url}"
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 9

该错误E2BIG指的是环境中的字节和argv列表的总和.脚本是否导出了大量(或巨大)的变量?在跑printenv之前跑wget,看看发生了什么.

  • 天啊!我甚至无法运行printenv.printenv命令本身没有参数,返回"参数列表太长"!我想我可以放心地说我遇到了环境问题,现在我只需要弄清楚该怎么办了. (2认同)