首页 > 解决方案 > 在 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(对于我尝试过的情况,它们适用于aliases 和变量。需要做什么才能使其适用于函数?

背景:我知道将事物设置为它们本来的样子似乎很奇怪。我的计划是保存当前设置,以便稍后重置。

标签: bash

解决方案


将各种评论放在一起,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"
}

推荐阅读