如何在OSX终端及Bash脚本中全局将gsed别名设置为sed?
全局将OSX的sed指向GNU Sed(gsed)的方法
问题原因
你在~/.bash_profile中添加的PATH配置仅对交互式Shell生效,而Bash脚本默认以非交互式Shell运行,不会加载~/.bash_profile,因此脚本仍会调用系统自带的BSD Sed。
解决方法
方法1:修改全局PATH配置(推荐)
将GNU Sed的路径加入全局Shell配置文件,让所有Shell(包括非交互式脚本)优先识别gsed:
- 编辑全局配置文件(需sudo权限):
sudo nano /etc/profile - 在文件末尾添加:
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH" - 保存退出后,重启终端或执行
source /etc/profile使配置生效。
方法2:创建软链接直接替换sed
在系统可执行路径中创建sed软链接指向gsed,确保所有场景下调用sed都指向GNU版本:
- 确认gsed的安装路径:
正常输出为which gsed/usr/local/bin/gsed或/usr/local/opt/gnu-sed/libexec/gnubin/sed - 创建软链接到
/usr/local/bin(该路径默认优先级高于系统自带的/usr/bin/sed):sudo ln -s $(which gsed) /usr/local/bin/sed - 验证生效状态:
输出显示GNU sed版本信息即配置成功。sed --version
方法3:脚本内显式替换(临时方案)
若无需全局修改,可在依赖GNU Sed的脚本开头添加以下代码,强制将sed调用替换为gsed:
sed() { gsed "$@" }
注意事项
- 方法2创建软链接后,系统所有用户的
sed命令都会指向GNU版本,如需临时使用BSD Sed,可直接调用/usr/bin/sed。 - 确保
/usr/local/bin在PATH中的优先级高于/usr/bin,避免系统优先识别自带的sed。
内容的提问来源于stack exchange,提问作者OpenBSDNinja
相关产品推荐
相关产品推荐

