虽然可以争论的是我应该为我的DSL使用其他类型的库系统,但事实仍然是它可以在具有bash的Linux上运行,但在ksh和bash的OpenBSD上都无法运行。
我有一个Shell脚本,可以从其他Shell文件中加载环境变量(通过源代码)。一旦获取了所有文件,我便运行一个独立的应用程序,该应用程序使用环境来生成报告。
我很确定我已经用完了变量的可用内存...但是如何确定剩余的数量呢?
envtmpl
是我的环境模板的二进制代表。它将环境转换为golangmap[string]string
,然后将其转换为模板以生成代码。
local$ envtmpl --output=./src/zquery/report_Customers.go report.go.envtmpl
./regen.sh[174]: envtmpl: Argument list too long
argument list
不太长,它必须是环境的内容。
更新:我已经对您的测试进行了测试,以查看我到底有多少“内存”可用。似乎我的想法超出了我的想象,现在,当有两个简单的参数时,我必须重新考虑此错误消息的含义Argument list too long
。所以问题是这个错误真正是从哪里来的,它是什么意思?
obsd66:~/dev/zurvita/zquery$export var=1234578901234456789012345678901234567890123456789012345789012344567890123456789012345678901234567890
obsd66:~$while (( i++ < 10000 )) ;do var=$var$var ; print "i=$i\t" ${#var} ; done
i=1 200
i=2 400
i=3 800
i=4 1600
i=5 3200
i=6 6400
i=7 12800
i=8 25600
i=9 51200
i=10 102400
i=11 204800
i=12 409600
i=13 819200
i=14 1638400
i=15 3276800
i=16 6553600
i=17 13107200
i=18 26214400
i=19 52428800
i=20 104857600
i=21 209715200
i=22 419430400
ksh: internal error: unable to allocate memory
obsd66:~$echo $KSH_VERSION
@(#)PD KSH v5.2.14 99/07/13.2
更新:我将命令envtmpl...
完全替换为ls -l
,并且仅引用ls
时收到相同的错误。因此,它不是环境内存,也不是变量扩展。
更新:我尝试使用ls
而不是ls -l
来获得相同的结果。
更新:openbsd中的getconf ARG_MAX
产生的数字是我的linux计算机的2倍。在Linux上有效,但在openbsd上无效。