我的印象是,单个参数的最大长度在这里不是问题,而是整个参数数组的总大小加上环境的大小(仅限于ARG_MAX
. 因此,我认为类似以下的事情会成功:
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
Run Code Online (Sandbox Code Playgroud)
这- 100
足以解释 shell 和echo
进程中环境大小之间的差异。相反,我收到了错误:
bash: /bin/echo: Argument list too long
Run Code Online (Sandbox Code Playgroud)
玩了一段时间后,我发现最大值小了一个完整的十六进制数量级:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
Run Code Online (Sandbox Code Playgroud)
当减一被删除时,错误返回。看似单个参数的最大值实际上是放置在参数数组中字符串末尾的空字节ARG_MAX/16
的-1
帐户。
另一个问题是,当参数重复时,参数数组的总大小可以接近ARG_MAX
,但仍然不完全:
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; …
Run Code Online (Sandbox Code Playgroud)