设置mac默认使用GNU工具,比如使用GNU cat而不是BSD cat

mac和linux都是unix-like OS, 命令是有很多相似之处, 但也有很多不同之处. 比如cat命令, mac不支持-A选项. 使用起来不够方便. 这是因为mac的命令工具来自于BSD, 而linux默认是GNU. 让我决心换到GNU工具的是sed, 同样的sed命令, mac就运行不成功, 这是因为GNU实现了很多扩展. 类似情况的还有grep, 或许还有awk, 但awk我用得不多, 没感觉到区别.

好了, 废话不多说, 直接说怎么从mac的工具转到linux工具.

第一种方法(维护起来麻烦, 不建议)

  1. brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep. 其实在做完这步以后, 不喜欢折腾的人可以不做下一步, 因为gcat就可以用GNU cat了. 类似有ggrep. 但是我同时装了linux虚拟机, 有时候需要shell脚本既在mac上执行, 又在linux上执行, 希望名称上可以更统一. 于是做下一步:
  2. 在~/.bash_profile中添加
gnu_path="/usr/local/opt/coreutils/libexec/gnubin:/usr/local/opt/findutils/libexec/gnubin:/usr/local/opt/gnu-tar/libexec/gnubin:/usr/local/opt/gnu-sed/libexec/gnubin:/usr/local/opt/gawk/libexec/gnubin:/usr/local/opt/gnu-indent/libexec/gnubin:/usr/local/opt/grep/libexec/gnubin"
PATH=$gnu_path:$PATH
MANPATH="/usr/local/opt/coreutils/libexec/gnuman:/usr/local/opt/findutils/libexec/gnuman:/usr/local/opt/gnu-tar/libexec/gnuman:/usr/local/opt/gnu-sed/libexec/gnuman:/usr/local/opt/gawk/libexec/gnuman:/usr/local/opt/gnu-indent/libexec/gnuman:/usr/local/opt/grep/libexec/gnuman":$MANPATH

export PATH
export MANPATH

打开的新的session, readlink -e which cat, 以及man cat, 应该就是GNU了

第二种方法(初始设置麻烦一些, 但是后续添加非常方便)

对于bin和man page分别用不同的方法

bin
#!/usr/bin/env bash
print_usage() {
  cat <<- EOF
use gnu tools without prefix "g" on mac, for example, "cat" rather than "gcat"
EOF
exit 0
}
if [[ $1 =~ -h|--help ]]; then
	print_usage
fi
gnu_bin_path=/usr/local/gnubin
if [[ ! -d $gnu_bin_path ]]; then
	mkdir $gnu_bin_path
fi
for i in /usr/local/opt/*/libexec/gnubin/*
do
	ln -s $i $gnu_bin_path
done
echo "finish"

sudo bash执行这段脚本.

然后在~/.bash_profile中添加:

PATH=/usr/local/gnubin/:$PATH
export PATH
man page

添加这段脚本在~/.bash_profile中:

join_str() {
	sep="$1"
	shift
	first_word="$1"
	shift
	printf "%s" "$first_word" "${@/#/$sep}"
}

manpath=(/usr/local/opt/**/libexec/gnuman/)
joined_manpath=`join_str : ${manpath[@]}`
MANPATH=$joined_manpath:$MANPATH
export MANPATH
unset manpath
unset joined_manpath
如何维护?

man page不需要做什么, 对于bin, 再次执行上面的脚本就可以了.

posted @ 2021-01-23 22:31  Tokubara  阅读(308)  评论(0编辑  收藏  举报