我正在尝试在bash脚本中设置和编辑永久环境变量, 添加导出VAR =“demo”到.bash_profile工作为set peramently目的, 但我无法编辑此var,
这个想法是编写一个脚本来设置或编辑该文件中是否存在。
现在尝试了这段代码,但没有成功:
VARIABLE_FILE=/root/.bash_profile
if [ -f ${VARIABLE_FILE} ] ; then
. ${VARIABLE_FILE}
if [ ! -z "${USER_PROMPT}" ] ; then
export USER_PROMPT="haloooo"
echo "USER PROMPT : $USER_PROMPT"
# Prints the correct value but doesn't update .bash_profile
fi
fi
答案 0 :(得分:2)
这些命令不会修改任何文件 - 如果文件存在则读取文件,然后仅在当前上下文中导出变量 ,并将值打印到标准输出(通常是终端)。 / p>
不建议以编程方式修改点文件,因为由于实际代码与打印代码的混合(在修改脚本中)而且您基本上可以遇到许多微妙的错误无法确定目标文件是否包含使脚本出现异常行为的内容。这一点,加上无法以普通用户身份登录的危险,这是避免这种情况的一般原因。你被警告了。
要实际执行此操作,您只需在文件末尾添加一个带有新值的新行:
echo "USER_PROMPT=haloooo" >> "$VARIABLE_FILE"
这将导致重复的条目,但如果你只是将文本和变量放在变量定义中,它应该至少是快速的,并且非常安全只要你的文件总是以换行符结尾
更高级的版本是替换该行:
if grep '^USER_PROMPT=' -- "$VARIABLE_FILE"
then
sed -i -e 's/^USER_PROMPT=.*/USER_PROMPT=haloooo/' -- "$VARIABLE_FILE"
else
echo "USER_PROMPT=haloooo" >> "$VARIABLE_FILE"
fi
请注意,如果您想在替换值中添加任意文本,则必须确保escape it for sed
。此外,此命令将覆盖以USER_PROMPT=
开头的每个行,因此如果您希望它在脚本中的不同时间具有不同的值(变量重用是一般是邪恶的)你刚刚介绍了一个bug。如果您需要,可以尝试replacing only the last occurrence。
更高级的版本可能能够处理缩进代码,检查代码是否是字符串或注释的一部分,以及其他功能,但最后,为了可靠地执行此操作,您必须解析语言结构,在Bash中不容易。