Linux可运行的Shell脚本在MacOS运行出现语法错误如何解决
问题原因
MacOS 系统默认预装的 GNU Bash 版本停留在 3.2.x 版本(受开源协议变更影响苹果未跟进更新更高版本),该版本不支持 Bash 4.0 新增的&>>语法(该语法作用是将标准输出、标准错误流共同追加写入指定文件末尾),因此在 Ubuntu(默认搭载 Bash 4.0+ 版本)上运行正常的脚本,在MacOS上就会抛出语法错误。
解决方案
以下三种方案任选其一即可:
- 替换不兼容语法(兼容性最优,无需修改系统环境,修改后脚本可同时适配 Linux、MacOS 旧版 Bash 环境)
把代码中的&>>替换为等价的兼容写法>> 目标文件路径 2>&1,修改后的对应代码如下:ssh_conn "${SOURCE_SERVERNAME}" 'exec 2>&1; whmapi1 fetch_ssl_certificates_for_fqdns domains='${ssl_host}'; exit' >> "${TMP_TRANSFER_DIR}/ssl_info_${ssl_host}.txt" 2>&1 - 安装新版 Bash 运行脚本
- 先通过 Homebrew 安装新版 Bash:
brew install bash - 两种调用方式任选:
- 修改脚本首行 shebang 为
#!/usr/bin/env bash,直接运行脚本即可自动调用brew安装的新版Bash - 手动指定新版Bash路径运行脚本,Intel芯片Mac路径为
/usr/local/bin/bash ./restorator.sh -V,Apple Silicon芯片Mac路径为/opt/homebrew/bin/bash ./restorator.sh -V
- 修改脚本首行 shebang 为
- 先通过 Homebrew 安装新版 Bash:
- 切换为zsh运行脚本
MacOS默认自带的zsh原生支持&>>语法,将脚本首行shebang修改为#!/bin/zsh即可,修改前建议确认脚本其余语法兼容zsh规范。
内容的提问来源于stack exchange,提问作者t3ranops
相关产品推荐
相关产品推荐

