在bash脚本中,我将环境变量设置为包含一百万个字符的字符串。我这样做:
export LG=XXXXXXX # ... 1 million X's
在此之后,我能够毫无问题地回复它,即
echo $LG
但是,我尝试在脚本内部运行之后运行的任何其他无关命令都会因"参数列表太长而失败"错误。例如:
cat randomfile.txt
/bin/cat: Argument list too long
我已阅读其他帖子,建议使用xargs解决此类问题,但我没有成功。如果我使用除echo之外的任何命令,那么我会得到"参数列表太长"即使我在设置后没有实际使用$ LG变量,也会出错。当然我想使用$ LG变量,但即使我在设置后没有使用它也会发生错误。
非常感谢任何提示,谢谢!
修改
我想解决的整体问题是这样的:
我有一个文本文件,我需要保持尽可能小(即几MB)。该文本文件包含一组封装在特定网络协议内的消息(即标题,消息长度,消息本身)。消息本身可以是长度为100万或更多的字符串。因此,为了保持原始文件的大小,而不是在文件中包含大型消息的多个副本,我使用映射。即如果我在消息字段中看到字母A,那么我然后使用sed来查找并替换100万个X&。像这样:
cat file.txt | sed "s/A/$LG/g" # Replace A with 1 million X's
我最终将在一个(非常慢的)模拟器中运行它,所以我需要这个操作尽可能少地完成。换句话说,像awk这样的实用程序使用一个行程计数为100万的循环来动态生成100万个X,这样太慢了。这就是我认为环境变量解决方案最好的原因。
答案 0 :(得分:7)
命令行参数和环境变量都来自同一个空间池。将环境变量设置得太长,并且您不再有空间用于命令行参数 - 甚至xargs
会将命令行调用分解为更小的分组,以便在可能的情况下放入池中,无法操作当那个游泳池完全满了。
所以:不要这样做。例如,您可以将数据存储在文件中,并将路径导出到环境中的该文件。
顺便说一下 - echo
的工作原因是它内置在你的shell中。因此,
echo "$LG"
...不需要启动外部流程,因此在流程启动时对参数列表长度和环境大小的限制不适用。
另一方面,如果你跑了
/bin/echo "$LG"
...然后你再次看到问题。
考虑到关于你实际想要完成什么的问题的解释,让我建议一种既不需要环境空间也不需要命令行空间的方法:
#!/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")