在bash中,如何“eval”函数定义?
我有以下函数定义:在bash中,如何“eval”函数定义?,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 | se
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$(别名${name})| source”
用于-a
和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"
}
请尝试
eval“$(get set def-f cdg)”
@Abelisto,它看起来可以工作,但我希望调用方不必这样做。@Abelisto,键入${varname}tail-n+2 | sed-e$'1{s/^/eval'function/}'-e$'${s/$/$/\'/}“
看起来很有效。我想我已经试过了,但肯定是在什么地方打错了。如果你想发布这个答案,我会投赞成票。为什么不干脆声明-f cdg
?设置def-f cdg
只要声明-f cdg
sed-e$'1{s/^/function/;}-e$'$${s/$/;}'为什么要这样做?删除它。