Iva*_*lev 3 linux bash shell environment-variables
在bash脚本中,我将环境变量设置为包含100万个字符的字符串.我这样做:
export LG=XXXXXXX # ... 1 million X's
Run Code Online (Sandbox Code Playgroud)
在此之后,我能够毫无问题地回复它,即
echo $LG
Run Code Online (Sandbox Code Playgroud)
但是,我在脚本内部尝试运行的任何其他无关命令都会因"参数列表太长"错误而失败.例如:
cat randomfile.txt
/bin/cat: Argument list too long
Run Code Online (Sandbox Code Playgroud)
我已阅读其他帖子,建议使用xargs解决此类问题,但我没有成功.如果我使用除echo之外的任何命令,那么即使在我设置它之后我实际上没有使用$ LG变量,我也会得到"参数列表太长"错误.当然我想使用$ LG变量,但即使我在设置后不使用它也会发生错误.
任何提示将不胜感激,谢谢!
编辑:
我试图解决的整体问题是这样的:
我有一个文本文件,我需要保持尽可能小(即几MB).此文本文件包含一组封装在特定网络协议内的消息(即标头,消息长度,消息本身).消息本身可以是长度为100万或更多的字符串.因此,为了保持原始文件的大小,而不是在文件中包含大型消息的多个副本,我使用映射.也就是说,如果我在消息字段中看到字母A,那么我使用sed来查找并替换A和100万个X. 像这样:
cat file.txt | sed "s/A/$LG/g" # Replace A with 1 million X's
Run Code Online (Sandbox Code Playgroud)
我最终会在一个(非常慢的)模拟器中运行它,所以我需要这个操作尽可能少地完成.换句话说,像awk这样的实用程序使用一个行程数为100万的循环来动态生成100万个X.这样的实用程序太慢了.这就是我认为环境变量解决方案最好的原因.
命令行参数和环境变量都来自同一个空间池.将环境变量设置得太长,并且您不再有空间用于命令行参数 - 甚至xargs,在可能的情况下,将命令行调用分解为更小的分组以适应池内,当该池完全填满时,无法操作.
所以:不要这样做.例如,您可以将数据存储在文件中,并将路径导出到环境中的该文件.
顺便说一句 - 原因echo是它内置于你的shell中.从而,
echo "$LG"
Run Code Online (Sandbox Code Playgroud)
...不需要启动外部进程,因此在进程启动时对参数列表长度和环境大小的限制不适用.
另一方面,如果你跑了
/bin/echo "$LG"
Run Code Online (Sandbox Code Playgroud)
...然后你会再次看到问题.
考虑到关于你实际想要完成什么的问题的解释,让我建议一种既不需要环境空间也不需要命令行空间的方法:
#!/bin/bash
# ^-- also consider ksh; faster than bash, but also supports <()
# /bin/sh is not usable here, as POSIX sh does not specify <().
lg=... ## DO NOT USE export HERE!
sed -f <(printf '%s\n' "s/A/$lg/g")
Run Code Online (Sandbox Code Playgroud)