2026/10/10 2:50:35

Mac 当主机,Linux 当服务器(4)Mac 能跑、Ubuntu 报错?BSD 与 GNU 的「方言坑」一次理清

Mac 当主机,Linux 当服务器(4)Mac 能跑、Ubuntu 报错?BSD 与 GNU 的「方言坑」一次理清 摘要:明明是同一个脚本,在 Mac 上跑得好好的,一传到 Ubuntu 就报错——这是运维新手最迷惑的坑之一。根源是 macOS 用 BSD 系工具、Linux 用 GNU 系工具,两大家族「长得像、脾气不一样」。这篇把sed -i、date、grep -P、readlink -f等六组经典差异做成总表,再给你老周的三条生存法则。承接上篇:权限搞明白了,小林打开 Hugo 准备搭博客。结果先栽在了一门「方言课」上。一、一个脚本引发的「血案」早上,小林在 Mac 终端写了个脚本check_user.sh:#!/bin/bashecho"当前用户是:$(whoami)"echo"当前目录是:$(pwd)"echo"今天日期是:$(date+%Y-%m-%d)"在 Mac 上跑:bashcheck_user.sh当前用户是:xiaolin 当前目录是:/Users/xiaolin 今天日期是:2026-09-13SSH 到 Ubuntu,传过去再跑:当前用户是:devops 当前目录是:/home/devops 今天日期是:2026-09-13「也没问题啊。看来 Mac 和 Linux 差不多嘛。」老周端着保温杯路过:「你 Mac 上bash是哪来的?」「系统自带的吧?」「Mac 自带的 bash 是 3.2 版本,2007 年的老古董。你 Ubuntu 上的 bash 是 5.x。写简单脚本没问题,稍微复杂一点,就开始『方言』打架了。」「方言?」「对。Mac 和 Linux 都是 Unix-like,但命令行工具来自两个不同的家族:Mac 用 BSD 系,Linux 用 GNU 系。这俩家族,命令长得像,脾气不一样。」二、BSD vs GNU:六组最常见的「方言」差异这张表建议截图存下来,以后遇到报错第一个翻它:下面逐个说清楚。1.sed -i:最经典的坑,没有之一想批量替换文件内容,小林写:echo