bash - 在 bash 中,如何评估函数定义?
问题描述
我有以下函数定义:
function get-set-def() {
flag=$1
varname=$2
case "${flag}" in
-a)
type ${varname} | sed -e 's|^|eval \$(alias |' -e $'s| is aliased to \`|=\'|' -e 's|$|)|'
;;
-f)
type ${varname} | tail -n +2 | sed -e $'1{ s/^/function /; }' -e $'${ s/$//; }'
;;
-v)
echo ${!varname} | sed -e "s|^|eval \$(${varname}=|" -e 's|$|)|'
;;
esac
}
对于函数,cdg
在这种情况下,它将输出:
$ get-set-def -f cdg
function cdg ()
{
cd "$(git rev-parse --show-toplevel)"/"$1"
}
但如果我尝试eval
它的输出,我会看到:
$(get-set-def -f cdg)
bash: function: command not found
即使复制和粘贴输出工作正常:
$ function cdg ()
{
cd "$(git rev-parse --show-toplevel)"/"$1"
}
$ type cdg
cdg is a function
cdg ()
{
cd "$(git rev-parse --show-toplevel)"/"$1"
}
我尝试了不同的组合eval
(对于我尝试过的情况,它们适用于alias
es 和变量。需要做什么才能使其适用于函数?
背景:我知道将事物设置为它们本来的样子似乎很奇怪。我的计划是保存当前设置,以便稍后重置。
解决方案
将各种评论放在一起,echo "echo $(declare -f ${name}) | source"
作品。
对于echo "echo $(alias ${name}) | source"
工作-a
也是如此echo "echo $(echo ${name}=${!name}) | source"
。-v
总而言之,函数变为:
function get-set-def() {
flag=$1
name=$2
local def
case "${flag}" in
-a)
def="$(alias ${name})"
;;
-f)
def="$(declare -f ${name})"
;;
-v)
def="$(echo ${name}=${!name})"
;;
esac
echo "echo ${def} | source"
}
推荐阅读
- postgresql - 删除表单表不起作用psql
- protractor - 无法单击量角器中的图像
- android - GAv4 丢弃命中。缺少命中类型参数:tid=_GTM_DEFAULT_TRACKER_
- c++ - 无法修改其他线程中 ref 传递的值
- laravel - 自更新到高山脉以来,本地主机上的错误 403 apache
- javascript - 手风琴“Hop”故障
- javascript - 使用 Babel 编译 TypeScript 单例失败
- html - 将 html 转换为复选框剃刀视图
- java - Spring-Boot:运行 spring-boot restful 程序失败
- unity3d - 使用 Unity Vimeo API 下载 Vimeo 视频以供离线使用