Shell 变量赋值的内存要求

Memory Requirements of Shell Variable Assignment

我有一个资源非常有限的系统,我有大约 900kB 的空闲内存,需要实现一个脚本来读取本地文件,获取 IP 地址,然后 ping 它并寻找响应(到检查它是否仍在工作网络上)。

我遇到的问题不在于文件的解析或参数的传递,而是当我尝试使用命令替换来创建一个用于 ping 的变量时,我可以看到设备冻结并且它 returns SIGSEGV 错误代码:

addrVar=`cat some_file_with_only_an_ip_address`

这似乎是一项微不足道的任务,文本文件的解析应该占用更多的内存和处理器,但它工作正常。我似乎无法在有相同或相似问题的任何地方找到任何提示。有谁知道为什么这不起作用以及可能的解决方案吗?

完整的示例代码为:

#!/bin/sh
sed -nr 's/IPADDR="([^ ]+)"//p' /etc/config/net > tmpVarFile
var1=`cat tmpVarFile` #this fails, but not the above

其中 tmpVarFile 只包含一个 ip 地址

谢谢!

解决方案

请参阅下面@CharlesDuffy 的回答。

完成这项工作的最佳方法是读取 /etc/config/net 文件,该文件的格式类似于一组 shell 变量(例如 ipaddress="x.x.x.x"),然后只需使用以下命令:

. /etc/config/net
if ping -c 1 ipaddress;
then
echo "Success"
else
echo "Failure"
fi

希望对您有所帮助!

这里有一个简单的解决方法,因为您只需要阅读一行:

read -r var1 <tempVarFile

这完全避免了使用任何子进程,显着减少了内存使用(其中大部分将与 fork() 相关联以启动子进程shell——这不会太大现代平台执行写时复制,但很难说出古老的微型嵌入式平台会做什么——fork() 再次变为 运行 /bin/cat)。


或者,如果 /etc/config/net 是可信的,并且保证是一个有效的 shell 脚本,没有不必要的副作用:

. /etc/config/net
if ping "$IPADDR"; then
  : ...etc...
fi