bash shell:脚本中修改profile文件更新LD_LIBRARY_PATH的示例
来源:互联网 发布:matlab创建稀疏矩阵 编辑:程序博客网 时间:2024/06/06 04:05
当我们的一个项目完成,需要在linux下安装,就要写安装脚本,有时还需要修改profile文件修改环境变量。这时就要用到sed编辑器。sed编辑器被称作流编辑器(stream editor),跟普通交互式文件编辑器相反。在交互式编辑器中(比如vim),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
于是我们可以利用sed编辑器在安装脚本实现对profile文件的修改。
下面我们以一个实际应用的例子来说明:
我已经有一个叫CASSDK的项目,这个项目没有可执行文件,只是一组动态库文件提供别的应用程序调用(比如java),需要为它写一个安装脚本,脚本的作用是将在将文件复制到指定安装目录,然后修改LD_LIBRARY_PATH
变量,将安装目录加入到LD_LIBRARY_PATH
变量中,以便java代码进行JNI库加载。
另外还要写一个卸载脚本,在删除安装目录后,同时将profile中的LD_LIBRARY_PATH
变量也同步修改。
下面是原始的profile脚本片段
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATHexport LD_LIBRARY_PATH=/usr/local/face/lib:$LD_LIBRARY_PATH
下面是安装脚本片段,在文件末尾添加export语句INSTALL.sh
# 定义安装目录位置的变量cassdk_path=/home/gdface/cassdk# 定义要在profile中搜索的行new_export="export LD_LIBRARY_PATH=$cassdk_path:\$LD_LIBRARY_PATH"# 将搜索行中转为正则表达式reg_str="^\s*export\s*LD_LIBRARY_PATH=$cassdk_path:\$LD_LIBRARY_PATH"# 先用grep查找profile是否已经有了指定的语句,如果有,则就不需要再添加了if grep -q $reg_str /etc/profilethenecho $cassdk_path exists in LD_LIBRARY_PATH,skipelse # export LD_LIBRARY_PATH=$cassdk_path:\$LD_LIBRARY_PATH echo defined LD_LIBRARY_PATH variable # 直接在profile末尾添加新行 echo $new_export >> /etc/profilefi# 显示export语句grep $reg_str /etc/profile
INSTALL.sh执行后
profile文件的末尾增加一行export LD_LIBRARY_PATH=/home/gdface/cassdk:$LD_LIBRARY_PATH
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATHexport LD_LIBRARY_PATH=/home/hadoop/workspace/cassdk/release/cassdk_linux_x86_64/bin:/usr/local/face/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=/home/gdface/cassdk:$LD_LIBRARY_PATH
下面是卸载脚本(UNINSTALL.sh)片段,用sed修改profile文件,删除安装脚本添加的export语句
# 定义安装目录位置的变量cassdk_path=/home/gdface/cassdk# 将cassdk_path字符串中的特殊字符/和.替换为\/和\. ,以适合正则表达式要求reg_path=`echo $cassdk_path|sed -r 's/([\/\.])/\\\\\1/g'`echo delete the line if exist:echo \"export LD_LIBRARY_PATH=$cassdk_path:\\\$LD_LIBRARY_PATH\"# 调用sed删除正则表达式指定的行sed -i_bak -r "/^\s*export\s*LD_LIBRARY_PATH=$reg_path:\$LD_LIBRARY_PATH/d" /etc/profile # 正则表达式中/d是指删除 # -i_bak参数是指在修改profile之前先做一个名为profile_bak的备份。
UNINSTALL.sh执行后脚本中export LD_LIBRARY_PATH=/home/gdface/cassdk:$LD_LIBRARY_PATH
这行代码被自动删除
上面的修改是用/etc/profile
来示例的,所以需要用root权限执行,当然你也可以用同样的办法修改~/.bash_profile
。
- bash shell:脚本中修改profile文件更新LD_LIBRARY_PATH的示例
- shell脚本中修改文件的内容
- Linux的简单shell脚本中修改文件操作
- Linux的简单shell脚本中修改文件操作
- Linux的简单shell脚本中修改文件操作
- Linux的简单shell脚本中修改文件操作
- shell脚本中#!/bin/bash
- 解决shell脚本中"/bin/bash^M: 坏的解释器: 没有那个文件或目录"
- shell脚本中简单的函数示例
- 实用的shell脚本-------修改cfg文件
- unix 的 bash shell 脚本
- shell的初始化文件:/etc/profile和/etc /bashrc(bash.bashrc)
- shell的初始化文件:/etc/profile和/etc/bashrc(bash.bashrc)
- shell的初始化文件:/etc/profile和/etc/bashrc(bash.bashrc)
- shell脚本中sh与bash 的差别
- bash启动退出读取的profile文件
- BASH命令和SHELL脚本总结(18)使用ACK在指定类型的文件中进行查找
- BASH命令和SHELL脚本总结(17)在BASH中计算两天的间隔天数
- Android 播放音乐
- JMS之activemq消息持久化
- $(document).ready() 和 window.onload 的区别
- mybatis之annotation(一)
- CodeForces 689B Mike and Shortcuts(SPFA)
- bash shell:脚本中修改profile文件更新LD_LIBRARY_PATH的示例
- struts2使用注解--ACTION中的应用
- 计算的本质:有关表示,编译,赋值,异步和流的杂谈
- HDOJ 3790 Balanced Number
- 深入理解Java中为什么内部类可以访问外部类的成员
- EL表达式从request和session中取值
- Android获取屏幕宽度和动态调整空间宽高
- URI和URL的区别和联系
- 视频基础知识-封装格式和编码格式