更新脚本后执行仍运行旧版本的问题及自动化解决方法咨询
哈哈,这个坑我之前踩过!核心问题其实有两个:要么是你的符号链接指向错了,要么是shell的命令缓存在搞鬼,咱们一步步来解决:
首先先排查符号链接的问题——你之前是在~/bin创建链接再复制到/usr/local/bin,这里很容易踩相对路径的坑!比如如果你用ln -s a.sh a创建的是相对路径链接,复制到/usr/local/bin后,这个链接会指向**/usr/local/bin/a.sh**而不是你/bin里的那个!这时候你改/bin的脚本当然没用。
先检查下你的链接是否正确:
ls -l /usr/local/bin/a
如果输出里的目标是a.sh(不是绝对路径),那赶紧重新创建正确的链接:
# 直接在/usr/local/bin创建指向你脚本的绝对路径链接,一步到位,以后不用复制了 ln -sf ~/bin/a.sh /usr/local/bin/a
搞定链接问题后,还有个shell缓存的小麻烦:当你第一次执行a命令时,shell会把a对应的绝对路径(也就是~/bin/a.sh)缓存到它的hash表中,之后再执行a就直接用缓存的路径,不会重新检查脚本有没有更新。这就是为啥你改了脚本,执行a还是旧版本的原因。
接下来给你几个自动化的解决办法,挑你喜欢的用:
方法1:用别名强制每次执行前刷新缓存
这是最简单的办法,直接在你的shell配置文件(比如/.bashrc或者/.zshrc)里加一行:
alias a='hash -r && a'
保存后执行source ~/.bashrc(或者对应的配置文件)生效。以后每次你执行a,shell都会先刷新命令缓存,再运行脚本,保证用的是最新版本。
方法2:用文件监控脚本自动刷新缓存
如果你不想每次执行都刷新缓存,可以用inotify工具监控脚本的变化,自动刷新缓存:
- 先安装inotify-tools:
- Debian/Ubuntu:
sudo apt install inotify-tools - Mac:
brew install inotify-tools
- Debian/Ubuntu:
- 写一个监控脚本(比如
~/bin/watch_a.sh):
#!/bin/bash TARGET_SCRIPT=~/bin/a.sh if ! command -v inotifywait &> /dev/null; then echo "请先安装inotify-tools!" exit 1 fi echo "开始监控${TARGET_SCRIPT}的更新..." while inotifywait -e modify,move,create "$TARGET_SCRIPT"; do echo "脚本已更新,刷新a命令缓存..." hash a done
- 给脚本加执行权限:
chmod +x ~/bin/watch_a.sh - 让它在shell启动时后台运行:在~/.bashrc里加一行:
~/bin/watch_a.sh &
这样每次打开终端,这个脚本就会后台盯着你的a.sh,一旦你修改保存,它就自动刷新shell的缓存,下次执行a就是最新版本了。
方法3:手动刷新(应急用)
如果偶尔忘了自动化设置,改完脚本后直接执行:
hash a
或者刷新所有命令缓存:
hash -r
也能立刻生效。
这样以后改脚本就不用再重新复制链接啦!
内容的提问来源于stack exchange,提问作者dosfilesystem

