两者都是 Unix-like,命令行都遵循 POSIX,但底层模型不同:Linux 用 GNU 用户态、systemd、FHS 和 ext4/XFS;macOS 用 BSD 用户态、launchd、APFS 和 SIP/TCC。迁移时先换模型,再换命令;会 ls 不等于会用 launchctl。
最容易被忽略的三点是:BSD 工具选项与 GNU 不同,服务由 launchd 而不是 systemd 管理,系统路径和用户数据同时受 SIP 与 TCC 限制。下面按命令、路径、权限、服务和坑点展开。
| 用途 | Linux | macOS |
|---|---|---|
| 列目录 | ls | ls |
| 文本过滤 | grep | grep(BSD) |
| 查找文件 | find | find、mdfind |
| 复制 | cp | cp |
| 删除 | rm | rm |
| 权限 | chmod | chmod |
| 属主 | chown | chown |
| 扩展属性 | getfattr/setfattr |
xattr |
| 打开文件 | xdg-open |
open |
| 进程 | ps | ps |
| 结束进程 | kill | kill、killall |
| 服务管理 | systemctl | launchctl |
| 定时任务 | crontab | launchd(StartCalendarInterval) |
| 日志 | journalctl | log show |
| 地址与接口 | ip | ifconfig |
| 端口连接 | ss | netstat、lsof |
| DNS | dig | dig |
| 包管理 | apt/dnf |
brew |
| 磁盘与镜像 | parted、mount -o loop |
diskutil、hdiutil |
| 默认配置 | gsettings |
defaults |
/etc、可变数据放 /var、用户放 /home;macOS 用户放 /Users,系统在 /System,全局资源在 /Library,用户资源在 ~/Library,外接卷在 /Volumes。/etc、/tmp、/var 实际指向 /private/etc、/private/tmp、/private/var;用 realpath 确认真实路径,脚本比较路径时不要假设前缀。README 与 readme 在 macOS 会冲突,在 Linux CI 上才暴露。.app 目录包;从 Finder 或 Dock 启动的进程不继承终端 PATH,launchd 任务也只有极简 PATH,脚本要用绝对路径或显式设置环境变量。/mnt 或 /media,macOS 挂到 /Volumes;macOS 用 diskutil mount/unmount 管理卷,循环设备用 hdiutil 而不是 mount -o loop。rwx,Linux 常用 getfacl/setfacl,macOS 用 ls -le 和 chmod +a 查看、添加 ACL 条目。/System、/usr(/usr/local 除外)、/bin、/sbin 受 SIP 保护,root 也不能改;Linux 的 root 可以改系统文件,除非只读挂载、immutable 属性或 LSM 拦截。sudo 不能代替用户在系统设置里批准;Linux 常靠 video/audio 组、polkit 和桌面 portal。systemctl status 对应 launchctl print。/Library/LaunchDaemons,默认 root,无 GUI),user unit 对应 LaunchAgent(~/Library/LaunchAgents,登录用户会话)。journalctl -u,macOS 用统一日志 log show --predicate;launchd 任务的标准输出还要在 plist 里配置 StandardOutPath、StandardErrorPath。StartCalendarInterval;Catalina 起 cron 访问用户数据还需要授予完全磁盘访问。pmset 查看和修改休眠、唤醒与电源策略。sed -i:BSD sed 的 -i 必须紧跟备份后缀,sed -i 's/a/b/' file 会把脚本当成后缀;写成 sed -i '' -e 's/a/b/' file。find -printf、ls --color、grep -P、date -d、cp -t 在 macOS 默认工具里通常没有;用可移植写法,或安装 coreutils/findutils 后使用 gsed、gfind 等前缀版本。/proc:依赖 /proc/<pid> 的脚本和监控在 macOS 会失败;改用 ps、lsof、sysctl 和 log show。EnvironmentVariables 里补 PATH。/bin/bash 是 3.2,不支持关联数组、mapfile 和 ${var,,};默认交互 shell 是 zsh,脚本要么写 POSIX sh,要么用 brew 装新版 bash。com.apple.quarantine,直接 xattr -d 只是去掉提示,不会验证来源;先确认签名和来源。sed -i 's/a/b/' file 在 macOS 上会发生什么?正确写法是什么?sudo 仍然删不掉 /System/Library 下的文件?'s/a/b/' 当成 -i 的备份后缀并报错;正确写法是 sed -i '' -e 's/a/b/' file,空字符串表示不备份。EnvironmentVariables 里显式设置 PATH,并确认文件对运行用户可读可执行。/Library、/usr/local 或用户目录,而不是关闭 SIP。
小程序版
微信扫码,随时查命令