Mac 上一些命令行的兼容使用
提示
对于熟练 Linux 命令行的用户来说,MacOS 上的一些命令行指令用法可能会有一些差异
xargs
xargs 命令的格式如下
$ xargs [-options] [command]
在 Mac 上,使用 -I {} 选项来指定替换字符串,而在 Linux 上,使用 -i 选项来指定替换字符串
- 举例
Linux 下的命令
find ./target/generated-sources/ -name "*.java" | xargs -n1 -i cp {} ./src/main/java/com/grpc/mistra/generate/
在 Mac 下的等价命令为
find ./target/generated-sources/ -name "*.java" | xargs -n1 -I {} cp {} ./src/main/java/com/grpc/mistra/generate/
# 或者,大写 F 代替 {}
find ./target/generated-sources/ -name "*.java" | xargs -n1 -I F cp "F" ./src/main/java/com/grpc/mistra/generate/
使用xargs有个常用的场景:批量执行,例如下面批量查询域名的解析结果
cat domains.txt | xargs -I {} sh -c 'echo {}; dig {}'
sed
sed 命令的格式如下
$ sed [options] [expression] [file]
在 Mac 和 Linux 上,-i参数用于表示原地编辑文件(in-place),但两者的用法有所不同
- 举例
Linux(GNU sed):
sed -i 's/old/new/g' file.txt
macOS(BSD sed):必须提供备份扩展名参数(可为空字符串):
sed -i '' 's/old/new/g' file.txt # 不生成备份
sed -i .bak 's/old/new/g' file.txt # 生成 file.txt.bak 备份
兼容建议:安装 GNU sed 并以 gsed 使用,使行为与 Linux 一致:
brew install gnu-sed
如需无感替换,可在 ~/.bash_profile 或 ~/.zshrc 中设置:
alias sed='gsed'
补充说明:
gsed是GNU sed的可执行名GNU与BSD sed的-i行为差异源于二者的非POSIX扩展实现,-i参数在GNU解析为紧随选项的备份后缀,而在BSD解析为下一位置参数的备份后缀- 若需跨平台无差异原地替换,也可使用
Perl,Perl命令是指通过命令行界面运行的Perl脚本或命令,最常见的是使用perl解释器执行代码,例如perl -e '...'来运行单行命令,或perl script.pl来执行脚本文件
perl -pi -e 's/foo/bar/' example.txt