現在のシェルから関数を取得し、後で使用するために保存する正しい方法は何ですか?

現在のシェルから関数を取得し、後で使用するために保存する正しい方法は何ですか?

最近では、ワンタイム関数をたくさん書いています。時々私は「まあ、これを保存する必要があります」と言い、type <function name>それを使ってコードを表示してからコピーして.bashrcに貼り付けます。これを行うより速い方法はありますか?それとも、この目的のために作成された標準やコマンドはありますか?

FWIW、私はMintを実行しているパーソナルコンピュータでこれをやっているので、コピーや貼り付けなどの便利です。しかし、シェル専用環境に関する回答にも興味があります。

答え1

ksh、およびを含むKornに似たシェルでは、zsh次のことができますbashyash

typeset -fp myfunc

関数定義を印刷しますmyfunc

したがって、これを最後に追加できます~/.bashrc

typeset -fp myfunc >> ~/.bashrc

答え2

この目的のために作成されたいくつかの標準またはコマンド

よくわかりませんが、タイプ+テール+リダイレクトを使用できます。

たとえば、関数があります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 edit1 ワードのみ出力されます。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

関連情報