Shell变量赋值的内存要求

时间:2015-08-04 18:11:08

标签: shell scripting embedded-linux busybox

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

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

addrVar=`cat some_file_with_only_an_ip_address`

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

完整的示例代码是:

#!/bin/sh
sed -nr 's/IPADDR="([^ ]+)"/\1/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

希望有所帮助!

1 个答案:

答案 0 :(得分:2)

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

read -r var1 <tempVarFile

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

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

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