【问题标题】:Can bash show a function's definition?bash 可以显示函数的定义吗?
【发布时间】:2011-10-18 12:19:33
【问题描述】:

有没有办法在 bash 中查看 bash 函数的定义?

例如,假设我定义了函数foobar

function foobar {
    echo "I'm foobar"
}

以后有什么办法可以得到foobar运行的代码吗?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

【问题讨论】:

    标签: bash function


    【解决方案1】:

    使用type。如果foobar 是例如在您的~/.profile 中定义:

    $ type foobar
    foobar is a function
    foobar {
        echo "I'm foobar"
    }
    

    这确实找出了 foobar 是什么,如果它被定义为一个函数,它会调用 declare -f,如 pmohandras 所述。

    要仅打印函数的主体(即代码),请使用sed

    type foobar | sed '1,3d;$d'
    

    【讨论】:

    • @sjsupersumit 这个问题明确要求 Bash 解决方案。
    • type 也会扩展别名,这是一个不错的奖励:)
    • 这对我不起作用。它不显示函数的定义,它只显示它来自哪个文件。
    【解决方案2】:
    set | sed -n '/^foobar ()/,/^}/p'
    

    这基本上打印了 set 命令中以函数名 foobar () 开头并以 } 结尾的行

    【讨论】:

    • 我很惊讶set 输出a) cmets 被剥离,b) 函数名和parens 之间的空白区域标准化。我仍然不愿意使用它,因为可能存在包含 } 的变量,这可能会使简单解析失败。
    【解决方案3】:
    set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'
    

    foobar 是函数名。

    【讨论】:

    • 问题:只会显示到第一个“}”,当定义包含 Bash 确实允许的“{...}”嵌套时,这并不是所有内容。
    • 如果函数包含包含花括号模式的 here-doc/here-string 也会失败
    【解决方案4】:

    您可以使用 declare 显示 bash 中函数的定义。例如:

    declare -f foobar
    

    【讨论】:

    • 很好,直截了当,即使在其他加载的脚本文件中定义的函数也可以工作。也适用于 zsh。
    • 如果您使用typeset -f,则可以在非Linux系统上与旧shell一起使用
    • 还不错,它只显示了function 定义,因此您不必解析是否是您想要的。
    • 最佳答案在底部。这没有意义。
    • 也适用于zsh
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多