![从当前 shell 中获取函数并保存以供将来使用的正确方法?](https://linux22.com/image/181843/%E4%BB%8E%E5%BD%93%E5%89%8D%20shell%20%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%87%BD%E6%95%B0%E5%B9%B6%E4%BF%9D%E5%AD%98%E4%BB%A5%E4%BE%9B%E5%B0%86%E6%9D%A5%E4%BD%BF%E7%94%A8%E7%9A%84%E6%AD%A3%E7%A1%AE%E6%96%B9%E6%B3%95%EF%BC%9F.png)
我最近写了很多一次性函数。有时我会说“嗯,我应该保存这个”,我用type <function name>
它来显示代码,然后将其复制并粘贴到 .bashrc 中。是否有更快的方法来执行此操作,或者为此目的构建了一些标准或命令?
FWIW,我只是在运行 Mint 的个人计算机上执行此操作,因此复制和粘贴等便利很容易。但是,我也对特定于仅 shell 环境的答案感兴趣。
答案1
在类似 Korn 的 shell 中,包括ksh
、zsh
和,您可以执行以下操作bash
:yash
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