bash shell:脚本中修改profile文件更新LD_LIBRARY_PATH的示例

本文介绍如何在Linux环境下使用sed编辑器编写安装和卸载脚本来自动修改profile文件中的LD_LIBRARY_PATH环境变量,以支持项目的动态库加载。

当我们的一个项目完成,需要在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 functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
export 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/profile
then
echo $cassdk_path exists in LD_LIBRARY_PATH,skip
else	
	# export LD_LIBRARY_PATH=$cassdk_path:\$LD_LIBRARY_PATH
	echo defined LD_LIBRARY_PATH variable
	# 直接在profile末尾添加新行 
	echo $new_export >> /etc/profile
fi
# 显示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 functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
export LD_LIBRARY_PATH=/home/hadoop/workspace/cassdk/release/cassdk_linux_x86_64/bin:/usr/local/face/lib:$LD_LIBRARY_PATH
export 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

<think>嗯,用户问的是USERPROFILE环境变量的含义和作用。首先,我需要回忆一下自己关于Windows环境变量的知识。根据引用[4],USERPROFILE指向当前用户的个人文件夹,路径通常是C:\Users\<用户名>。比如,用户是Administrator的话,路径就是C:\Users\Administrator。 那用户可能想知道这个环境变量的具体用途。比如,应用程序可能会用它来找到用户的文档、下载目录等。比如,在编程时,代码可能需要访问用户的桌面路径,这时候就可以用USERPROFILE来拼接路径,比如%USERPROFILE%\Desktop。 然后,用户可能还想知道如何查看或设置这个变量。根据引用[3],在Windows中可以通过系统属性设置环境变量,或者在注册表里有对应的项。不过用户可能不需要太深入注册表的部分,但需要知道基本的位置:控制面板->系统->高级设置->环境变量。 另外,引用[1]提到环境变量不仅用于命令行,图形程序也会用它们来配置。比如,Java的JAVA_HOME,同样USERPROFILE可能被各种程序用来定位用户目录。比如安装程序可能会把用户数据存在这里。 用户可能遇到的问题包括:为什么某些程序找不到他们的文件?可能是因为环境变量没有正确设置,或者路径被修改了。需要解释USERPROFILE的作用,以及如何正确使用它。 可能还需要举例说明实际应用,比如在批处理脚本中使用%USERPROFILE%来快速访问用户目录,或者在代码中读取这个变量。比如在C#中使用Environment.GetEnvironmentVariable("USERPROFILE"),或者在Python中使用os.environ.get('USERPROFILE')。 还要注意不同系统版本的可能差异,比如Win10和Win7的路径是否一致。一般来说,USERPROFILE的结构在Win10中是保持一致的,但用户可能使用不同的用户名,所以路径会变化。 另外,可能需要提到用户文件夹下的子目录,比如Documents、Downloads、Desktop等,这些都可以通过USERPROFILE来访问,而不需要硬编码路径,这样程序就更具有可移植性。 总结下来,回答需要涵盖定义、作用、查看方法、实际应用举例,以及相关的注意事项。同时,根据用户的问题,可能不需要深入技术细节,而是以实用为主。需要确保引用正确的资料,比如引用[4]中的详细说明,以及引用[3]中的设置方法。</think>### USERPROFILE 环境变量详解 #### 1. 定义与作用 **USERPROFILE** 是 Windows 操作系统中一个预定义的环境变量,用于表示当前用户的个人文件夹路径。其典型格式为: $$C:\Users\<用户名>$$ 例如,若当前登录用户名为 `Administrator`,则 USERPROFILE 值为: $$C:\Users\Administrator$$ **核心作用**: - **定位用户专属文件**:系统及应用程序通过该变量快速访问用户的文档、下载、桌面等目录[^4]。 - **个性化配置**:许多程序(如浏览器、开发工具)会在此路径下存储用户配置文件和缓存数据[^1]。 - **简化路径操作**:在脚本或代码中可通过 `%USERPROFILE%` 动态引用用户目录,避免硬编码路径[^3]。 --- #### 2. 实际应用示例 - **命令行快速访问**: 在 CMD 或 PowerShell 中直接输入 `cd %USERPROFILE%\Desktop` 可跳转到当前用户的桌面。 - **编程调用**(Python 示例): ```python import os user_profile = os.environ.get('USERPROFILE') print(f"用户文档路径:{user_profile}\\Documents") ``` - **安装程序配置**:部分软件会将用户数据默认保存在 `%USERPROFILE%\AppData` 目录下。 --- #### 3. 查看与修改方法 - **查看方式**: 1. 命令行输入 `echo %USERPROFILE%` 2. 通过 **控制面板 > 系统 > 高级系统设置 > 环境变量** 查看。 - **修改警告**: 不建议手动修改此变量,可能导致系统或程序无法定位用户数据。特殊需求可通过注册表或组策略调整。 --- #### 4. 与其他环境变量的关系 | 变量名 | 关联路径示例 | 用途差异 | |----------------|----------------------------|------------------------| | `APPDATA` | `%USERPROFILE%\AppData\Roaming` | 存储漫游配置文件 | | `LOCALAPPDATA` | `%USERPROFILE%\AppData\Local` | 存储本地非同步数据 | | `TEMP` | `%USERPROFILE%\AppData\Local\Temp` | 临时文件存储 | ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值