在 bash 脚本中,我设置了一个环境变量来包含 100 万个字符的字符串。我这样做是这样的:
export LG=XXXXXXX # ... 1 million X's
在此之后,我可以毫无问题地回显它,即
echo $LG
但是,在此之后我尝试在脚本内运行的任何其他不相关命令都会失败,并出现“参数列表太长”错误。例如:
cat randomfile.txt
/bin/cat: Argument list too long
我读过其他建议使用 xargs 来解决此类问题的帖子,但我没有成功。如果我使用 echo 以外的任何命令,那么即使我在设置 $LG 变量后实际上没有使用它,也会收到“参数列表太长”错误。我当然想使用$LG变量,但是设置后即使不使用也会出现错误。
任何提示将不胜感激,谢谢!
Edit:
我试图解决的总体问题是这样的:
我有一个文本文件,需要保持尽可能小(即几 MB)。该文本文件包含一组封装在特定网络协议内的消息(即标头、消息长度、消息本身)。消息本身可以是长度为100万或更长的字符串。因此,为了保持原始文件大小较小,我使用映射,而不是在文件内保留大消息的多个副本。 IE。如果我在消息字段中看到字母 A,我就会使用 sed 查找 A 并将其替换为 100 万个 X。像这样:
cat file.txt | sed "s/A/$LG/g" # Replace A with 1 million X's
我最终将在(非常慢的)模拟器中运行此操作,因此我需要在尽可能少的周期内完成此操作。换句话说,像 awk 这样使用行程计数为 100 万次的循环来动态生成 100 万个 X 的实用程序会太慢。这就是为什么我认为环境变量解决方案是最好的。
命令行参数和环境变量都来自同一个空间池。将环境变量设置得太长,您将不再有空间用于命令行参数 - 甚至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")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)