Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中,如何“eval”函数定义?_Bash - Fatal编程技术网

在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/$/;}'为什么要这样做?删除它。