linux - 将环境变量设置为较大的值 -> "Argument list too long"

标签 linux bash shell environment-variables

在 bash 脚本中,我将环境变量设置为包含 100 万个字符的字符串。我这样做:

export LG=XXXXXXX # ... 1 million X's

在此之后,我可以毫无问题地回显它,即

echo $LG

但是,在此之后我尝试在脚本中运行的任何其他不相关命令都会失败,并出现“参数列表太长”错误。例如:

cat randomfile.txt
/bin/cat: Argument list too long

我已经阅读了其他建议使用 xargs 来解决此类问题的帖子,但我没有成功。如果我使用除 echo 以外的任何命令,那么我会收到“参数列表太长”错误,即使我在设置 $LG 变量后实际上并未使用它也是如此。我当然想使用$LG变量,但是设置后不使用也会报错。

任何提示将不胜感激,谢谢!

编辑:

我要解决的总体问题是这样的:

我有一个文本文件,需要尽可能小(即几 MB)。此文本文件包含一组封装在特定网络协议(protocol)中的消息(即 header 、消息长度、消息本身)。消息本身可以是长度为 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")

关于linux - 将环境变量设置为较大的值 -> "Argument list too long",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28865473/

相关文章:

javascript - 有没有我可以练习 javascript 的程序/shell?

c - 是否有任何用于绘制图片和制作.jpg 文件的C 库?

linux - 如何配置 "delete"键以删除 c shell 中的单词

linux - 为什么/lib/ld-linux.so.2 soname版本颠簸如此罕见?

我可以将 GCC 作为守护进程运行(或将其用作库)吗?

bash - 运行作为参数传递给 bash 脚本的多个命令

bash - 在 bash 中可以使用纳秒级的 strftime 吗?

bash - 如何使用命令输出填充 bash 关联数组?

bash - shell 中的 grep 无法按预期工作

bash - 使用 mysql 的结果填充 zenity 列表