macOS Ventura下sed引用上级目录命令文件时缓存旧版本问题求助
解决OSX下sed读取上级目录命令文件不更新的问题
可能的原因
OSX自带的是BSD版本的sed,它对相对路径引用的命令文件可能存在奇怪的缓存机制,导致修改文件后sed仍读取旧内容。你虽然装了Homebrew的coreutils,但coreutils不包含GNU sed,默认还是调用系统自带的BSD sed。
解决方案
1. 切换到GNU sed(推荐)
Homebrew有单独的GNU sed包,安装后替换系统sed使用:
- 安装GNU sed:
brew install gnu-sed - 安装后,GNU sed的命令是
gsed,把脚本里的sed -f ../sedcommands.txt改成gsed -f ../sedcommands.txt,就能正常读取修改后的命令文件。 - 如果想直接用
sed调用GNU版本,可把Homebrew的bin目录加到PATH前面,比如在~/.zshrc或~/.bashrc里添加:
(Intel Mac对应路径为export PATH="/opt/homebrew/bin:$PATH"/usr/local/bin,M系列Mac为/opt/homebrew/bin),重启终端后,which sed就会指向Homebrew的GNU sed。
2. 使用绝对路径引用命令文件
如果不想换sed版本,可在脚本里用绝对路径指定sedcommands.txt,避免相对路径触发缓存问题:
在脚本中加入以下代码,动态获取上级目录的绝对路径:
# 获取脚本所在目录的上级目录绝对路径 SED_CMD_DIR=$(cd "$(dirname "$0")/.." && pwd) SED_CMD_FILE="$SED_CMD_DIR/sedcommands.txt" # 用绝对路径调用sed sed -f "$SED_CMD_FILE"
这样不管脚本放在哪个子目录,都能精准定位到上级目录的命令文件,不会读取缓存的旧内容。
3. 清除文件系统缓存(临时应急)
如果只是临时解决,可尝试清除OSX的文件系统缓存:
sudo purge
不过这个方法治标不治本,后续修改文件可能还会出现同样问题,不如前两个方法靠谱。
内容的提问来源于stack exchange,提问作者user3338049
相关产品推荐
相关产品推荐

