Shell 脚本小试牛刀(3) -- libc库版本记录

一个完整的项目应该包括记录完整的环境,所以你的程序中可能需要记录:Linux内核版本、使用系统板本、文件系统版本、gcc版本等等,而这些记录的系统信息在程序维护以及升级时都是极为重要的宝贵资源。

当然这些信息你可以使用一个脚本记录到某一个文档中,或者直接插入数据库中,不管对结果怎么处理,使用shell脚本记录是一个很方便而且是可重用的。


但是使用脚本中一定要注意的问题是脚本的通用性!当然你也很难遇测以后的系统中文件的路径会不会发生变化!我就遇到这样的问题:我们的记录环境信息的脚本中记录 libc 库的版本行出错,打开找到该行,原版本市这么写的:

libc_verion=$(ls -l /lib/libc.so.6  | sed -e 's/.*libc-\(.*\).so/\1/g')

这段代码在一台老机器上运行是正常的:

root@debian:/tmp$ ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g'
2.11.3

但是我在我电脑上试运行  “ ls -l /lib/libc.so.6 ” 时,会报错:

long@Debian-PC:~$  ls -l /lib/libc.so.6
bash: ls -l /lib/libc.so.6: No such file or directory

所以出现的问题也很明显,那就是在我的系统上 libc 库的路径发生了变化,那么经过我的不懈努力呢(额,夸张了点哈)发现,在我的Debian 7 下libc 库被挪到了“ /lib/i386-linux-gnu/libc.so.6 ”路径下,于是,我写了如下小脚本替换了原来的查找 libc 库版本的命令行:

#!/bin/bash
# (C) 2014 Yunlong Zhou <reaper888@yeah.net>  
# Under licence  GPL  
# File :   record_libc_version.sh   
# Introduction:  
#       This script is using for record the libc library version  
# Useage :  
#       $ ./record_libc_version.sh 
#       Your system is : Debian-7.4
#       Your arch is :i686
#       Your kernel version is :3.12.1
#       Your libc library version is :2.13

echo "Your system is : Debian-"`cat /etc/debian_version`
echo "Your kernel version is :"`uname -r | cut -d "-" -f1`
echo "Your arch is :"`uname -a | cut -d " " -f14`
ls -l /lib/libc.so.6  &>/dev/null
if [ $? == 0 ] ;then
    libc_version=$(ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
else
    uname -a >/tmp/system_version
    if grep -q "x86_64" /tmp/system_version ; then
        libc_version=$(ls -l /lib/x86_64-linux-gnu/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
    elif grep -q "i386" /tmp/system_version || grep "i686" /tmp/system_version ; then
        libc_version=$(ls -l /lib/i386-linux-gnu/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
    else
        libc_version=$(ls -l /lib/*-linux-gnu*/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
    fi
    rm /tmp/system_version
fi

echo "Your libc library version is :"$libc_version


进行替换后,无论是在我的32位还是64位系统,亦或旧版本的机器上运行此脚本都是正常的:

在我的32位Debian台式机上运行结果为:
long@Debian-PC:/tmp$./record_libc_version.sh 
Your system is : Debian-7.4
Your kernel version is :3.12.1
Your arch is :i686
Your libc library version is :2.13

在我的64位Debian笔记本上运行结果为:
zhouyl@wheezy:~$ /tmp/record_libc_version.sh 
Your system is : Debian-7.4
Your kernel version is :3.12.9
Your arch is :x86_64
Your libc library version is :2.13

在旧机器上运行结果:
root@debian:/tmp$ ./record_libc_version.sh 
Your system is : Debian-6.0.9
Your kernel version is :3.12.1
Your arch is :i686
Your libc library version is :2.11.3

注: 目前手头没有旧版本的Debian机器,所以没有更旧版本的运行结果,如果你那运行有问题,请在留言处给我回复哦!!谢谢大笑


事实证明,else中使用匹配模式 " ls -l /lib/*-linux-gnu*/libc.so.6  "还是很有用的,我同学手里有一款 PcDuino ,亲测有效:

ubuntu@ubuntu:/tmp$ ./record_libc_version.sh 
Your system is : Debian-wheezy/sid
Your kernel version is :3.4.29+
Your arch is :armv7l    ---arm 架构的哦!
Your libc library version is :2.15

而,在这一款板子上,Libc库所在位置是:

ubuntu@ubuntu:/tmp$ ls -l    /lib/arm-linux-gnueabihf/libc.so.6
lrwxrwxrwx 1 root root 12 Oct  6  2012 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.15.so

因此,匹配成功~~ OK,效果不错,了罢此文~~



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值