是否可以在每次编辑 bashrc 文件并保存时自动运行“source .bashrc”?
答案1
一种方式,如另一个答案指出,将创建一个函数,用一个两步过程替换编辑器对 .bashrc 的调用
- 在 .bashrc 上打开编辑器
- 来源.bashrc
例如:
vibashrc() { vi $HOME/.bashrc; source $HOME/.bashrc; }
这有一些缺点:
vibashrc
这将要求您每次想要进行采购时都要记住输入- 它只会发生在你当前的 bash 窗口中
- 无论您是否对其进行任何更改,它都会尝试获取 .bashrc
另一种选择是挂钩到 bash提示命令每当看到 .bashrc 文件已更新(并且在显示下一个提示之前)时,在任何/所有 bash shell 中获取 .bashrc 的功能。
您可以将以下代码添加到 .bashrc 文件中(或用它扩展任何现有的 PROMPT_COMMAND 功能):
prompt_command() {
# initialize the timestamp, if it isn't already
_bashrc_timestamp=${_bashrc_timestamp:-$(stat -c %Y "$HOME/.bashrc")}
# if it's been modified, test and load it
if [[ $(stat -c %Y "$HOME/.bashrc") -gt $_bashrc_timestamp ]]
then
# only load it if `-n` succeeds ...
if $BASH -n "$HOME/.bashrc" >& /dev/null
then
source "$HOME/.bashrc"
else
printf "Error in $HOME/.bashrc; not sourcing it\n" >&2
fi
# ... but update the timestamp regardless
_bashrc_timestamp=$(stat -c %Y "$HOME/.bashrc")
fi
}
PROMPT_COMMAND='prompt_command'
然后,下次登录时,bash 将加载此函数和提示钩子,并且每次将要显示提示时,它都会检查 $HOME/.bashrc 是否已更新。如果有,它将快速检查语法错误(set -n
选项),如果文件是干净的,则获取它。
无论语法检查如何,它都会更新内部时间戳变量,以便在再次保存/更新文件之前不会尝试加载它。
答案2
也许是一个像这样的 shell 函数:
nano .bashrc ; source .bashrc
或者只是运行该命令?
答案3
你可以指示 bash.bashrc
在收到一个信号。将以下行放入您的.bashrc
:
trap '. ~/.bashrc' USR1
然后,每当您编辑完 后.bashrc
,发送交互的bash 信号的实例。 (不要将其发送到脚本!这会杀死它们。)没有万无一失的方法可以做到这一点,因此存在杀死不相关进程的风险。下面的 bash 片段很接近——它查找不带参数且使用来自终端(或任何其他字符设备,但实际上这不是问题)的标准输入调用的 bash:
ps -u "$(id -u)" -o pid= -o args= | while read -r pid args; do
if [[ $args = bash || $args = */bin/bash ]]; then
stdin="$(lsof -p"$pid" | sed -n '/^f0$/ { n; s/^n//p; q; }')"
if [ -c "$stdin" ]; then
kill -USR1 "$pid"
fi
fi
done
或者,为了避免信号方法的不可靠性,您可以让 bash 重新读取.bashrc
它自己的违规行为。这种方法的缺点是,即使您刚刚保存文件时出现语法错误或逻辑错误(例如无限循环),它也会重新读取文件。PROMPT_COMMAND
每次 bash 显示提示时都会执行该变量的内容,因此请将其放入您的.bashrc
:
reread_bashrc () {
if ((SECONDS > bashrc_last_read)); then
. ~/.bashrc
bashrc_last_read=$SECONDS
fi
}
bashrc_last_read=$SECONDS
PROMPT_COMMAND="$PROMPT_COMMAND
reread_bashrc"
这种方法的一个优点是它不会在您键入命令时触发。您至少必须按Enter。
答案4
edit_and_source () {
local tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT RETURN
cp -p "$1" "$tmpfile"
while true; do
command "${EDITOR:-vi}" "$tmpfile"
bash -n "$tmpfile" && break
echo 'There were errors. Re-edit?' >&2
read -p 'Yes/No/Force: '
case "$REPLY" in
[Yy]*) continue ;;
[Ff]*) break ;;
*) return ;;
esac
done
mv "$tmpfile" "$1"
}
此函数将允许您使用定义的编辑器(或者如果未设置)bash
编辑指定的文件,然后获取它。$EDITOR
vi
$ edit_and_source ~/.bashrc
如果编辑后文件有错误,该函数会询问您是否要再次编辑:
/tmp/tmp.ETdo10orcg: line 4: syntax error near unexpected token `('
/tmp/tmp.ETdo10orcg: line 4: ` nt hn thnt();0'
There were errors. Re-edit?
Yes/No/Force: n
回答“否”将使原始文件保持不变。回答“force”(或任何以“f”开头的单词)将强制安装有问题的文件。