从当前 shell 中获取函数并保存以供将来使用的正确方法?

从当前 shell 中获取函数并保存以供将来使用的正确方法?

我最近写了很多一次性函数。有时我会说“嗯,我应该保存这个”,我用type <function name>它来显示代码,然后将其复制并粘贴到 .bashrc 中。是否有更快的方法来执行此操作,或者为此目的构建了一些标准或命令?

FWIW,我只是在运行 Mint 的个人计算机上执行此操作,因此复制和粘贴等便利很容易。但是,我也对特定于仅 shell 环境的答案感兴趣。

答案1

在类似 Korn 的 shell 中,包括kshzsh和,您可以执行以下操作bashyash

typeset -fp myfunc

打印函数的定义myfunc

所以你可以将它添加到你的末尾~/.bashrc

typeset -fp myfunc >> ~/.bashrc

答案2

为此目的构建的一些标准或命令

我不知道,但是你可以使用 type + tail + 重定向

例如,我有一个函数edit()。这是我的type edit输出:

edit — это функция
edit () 
{ 
    for arg in "$@";
    do
        if which "$arg" > /dev/null; then
            subl $(realpath $(which "$arg"));
        else
            echo "$arg not found";
        fi;
    done
}

为了抑制第一行,edit — это функция我使用tail -n +2

$ type edit | tail -n +2
edit () 
{ 
    for arg in "$@";
    do
        if which "$arg" > /dev/null; then
            subl $(realpath $(which "$arg"));
        else
            echo "$arg not found";
        fi;
    done
}

然后我需要将此输出重定向到 .bash_profile 或 .bashrc 或其他任何内容: type edit | tail -n +2 >> $HOME/.bash_profile

现在让我们检查是否edit真的是一个函数: 如果它的参数是一个函数,则type -t edit仅输出一个单词。function

最终解决方案如下所示:

add_to_bash_profile() {
    local type_of_arg="$(type -t $1)"
    if [ "$type_of_arg" == "function" ]
    then 
        echo >> $HOME/.bash_profile #adding empty line for readability of .bash_profile
        type $1 | tail -n +2 >> $HOME/.bash_profile
    else
        echo "$1 is not a function"
    fi
}

现在你可以将此函数添加到你的 .bash_profile 中:

add_to_bash_profile add_to_bash_profile

相关内容