如何在M1 Mac上使用readlink -e并兼容bash脚本(无需关闭系统完整性保护)
如何在M1 Mac上使用readlink -e并兼容bash脚本(无需关闭系统完整性保护)
我之前也碰到过一模一样的问题,M1 Mac的系统完整性保护(SIP)确实锁死了/usr/bin目录,没法直接在里面创建软链。不过不用慌,有几个不用关闭SIP的实用解决办法,亲测有效:
方案一:将软链放到不受SIP保护的目录
系统的/usr/bin受SIP保护无法修改,但/usr/local/bin是用户可自由操作的目录,而且默认在系统PATH中的优先级比/usr/bin高。你只需要执行这条命令就能创建替代的软链:ln -s /opt/homebrew/bin/greadlink /usr/local/bin/readlink完成后,不管是在终端直接运行还是bash脚本里调用
readlink -e,都会优先使用这个软链指向的greadlink,完美适配原有逻辑。方案二:修改脚本直接调用greadlink
如果不想折腾软链,也可以直接调整你的bash脚本:- 在脚本开头添加PATH配置,确保brew的bin目录被优先识别:
export PATH="/opt/homebrew/bin:$PATH" - 把脚本里所有的
readlink -e替换成greadlink -e
这样脚本就能直接调用brew安装的greadlink,完全绕开系统自带的版本。
- 在脚本开头添加PATH配置,确保brew的bin目录被优先识别:
方案三:在脚本中定义兼容函数(保留原有写法)
要是不想逐行修改脚本里的readlink,可以在脚本开头定义一个函数,让readlink自动转发所有参数给greadlink:export PATH="/opt/homebrew/bin:$PATH" readlink() { greadlink "$@" }这样脚本里原来的
readlink -e写法完全不用改动,函数会自动帮你处理参数转发,兼容性拉满。
备注:内容来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

