为何调用的非交互式Bash Shell可读取$HISTFILE,而Bash脚本不行?
问题解决:非交互式Bash脚本中获取$HISTFILE变量
先理清核心矛盾
你遇到的bash -c "echo $HISTFILE"能返回路径的情况,不是子shell里的$HISTFILE生效了——因为双引号会让当前shell先解析变量,把$HISTFILE替换成实际路径后再传给子shell,子shell只是echo这个已经替换好的字符串而已。你换成单引号试试:
bash -c 'echo $HISTFILE'
这时候就会输出空,和脚本里的情况一致,这才是子shell真实的$HISTFILE状态。
为什么脚本里$HISTFILE为空
Bash在非交互式非登录模式下(普通脚本默认就是这种模式),不会自动加载~/.bashrc、~/.bash_profile这类配置文件,而HISTFILE是交互式shell才会默认设置的变量,所以脚本里自然为空。
不用#!/bin/bash -i的解决方案
既然不能用交互式shell(避免脚本命令进历史),可以用以下几种方式获取HISTFILE:
调用脚本时手动传递变量
执行脚本时把当前shell的HISTFILE传进去:HISTFILE="$HISTFILE" ./your_script.sh脚本里直接用
$HISTFILE就能拿到路径。从用户的Bash配置文件中读取
如果你的HISTFILE是在~/.bashrc里设置的,脚本里可以直接读取配置:# 从~/.bashrc中提取HISTFILE的设置,去掉引号 HISTFILE=$(grep '^HISTFILE=' ~/.bashrc | cut -d= -f2 | sed "s/['\"]//g")注意:如果你的配置写在
~/.bash_profile或~/.profile里,把路径换成对应的文件即可。直接指定路径(不推荐,除非路径固定)
如果你的历史文件路径永远不会变,也可以直接在脚本里写死:HISTFILE="/home/user/.bash_history"
内容的提问来源于stack exchange,提问作者rob
相关产品推荐
相关产品推荐

