You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将依赖GNU sed的Bash goto函数适配为BSD sed兼容版本?

兼容BSD sed的Bash goto函数修改方案

原代码中的sed命令依赖GNU sed的语法,BSD sed(macOS默认版本)对标签定义的语法要求更严格——标签必须作为独立命令存在,不能和其他命令用分号放在同一行。以下是修改后的兼容版本:

#!/bin/bash
scriptDir="$(cd "$( dirname "$BASH_SOURCE")" && pwd)"

function goto
{
    shortcutName=$1
    # 修改sed命令,适配BSD sed语法
    newPosition=$(sed -n "/: $shortcutName$/{
        :a
        n
        p
        ba
    }" "$scriptDir/$(basename -- "$BASH_SOURCE")")
    eval "$newPosition"
    exit
}
alias :="goto"

# script code

: somegotolabel

# script code

goto somegotolabel

修改说明

  • 核心逻辑保持不变:找到匹配: shortcutName的行后,从下一行开始循环打印所有内容,通过eval执行这些代码并退出当前函数。
  • 关键修改点:将原sed脚本中用分号串联的命令拆分为换行结构,让标签:a成为独立的命令行——BSD sed不允许标签定义与其他命令在同一行用分号拼接,必须单独占据一行。

你也可以用多-e参数的方式拆分命令,效果完全一致:

newPosition=$(sed -n -e "/: $shortcutName$/{:a" -e "n" -e "p" -e "ba" -e "}" "$scriptDir/$(basename -- "$BASH_SOURCE")")

内容的提问来源于stack exchange,提问作者parricc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:42:21