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
我有一个资源非常有限的系统,我有大约 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