导出不起作用(来自一个被称为获取其回声的函数)

rob*_*ert 9 bash export function echo

我有这样的代码:

#!/usr/bin/env bash

test_this(){
  export ABC="ABC"
  echo "some output"
}

final_output="the otput is $(test_this)"
echo "$ABC"
Run Code Online (Sandbox Code Playgroud)

不幸的是,变量ABC没有被设置.

我必须这样调用test_this,因为在我的真实程序中我给它一些参数,它执行各种复杂的操作调用各种其他函数,这些函数导出这个或那个(基于这些参数),最后一些输出字符串被组装以返回.调用它两次,一次获取导出,一次输出字符串就不好了.

问题是:我可以做什么来使输出和输出字符串到位,但只需要调用一个这样的函数?

我很满意的答案(谢谢你paxdiablo):

#!/usr/bin/env bash

test_this(){
  export ABC="ABC"
  export A_VERY_OBSCURE_NAME="some output"
}

test_this
final_output="the otput is $A_VERY_OBSCURE_NAME"
echo "$ABC"  #works!
unset A_VERY_OBSCURE_NAME
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 9

是的,它被设置.不幸的是,它被设置在由运行函数创建的子进程中,并且对父进程没有影响.$()test_this

调用它两次可能是最简单的方法,例如(使用"秘密"参数值来指示行为,如果它需要不同):

#!/usr/bin/env bash

test_this(){
  export ABC="ABC"
  if [[ "$1" != "super_sekrit_sauce" ]] ; then
    echo "some output"
  fi
}

final_output="the output is $(test_this)"
echo "1:$ABC:$final_output"
test_this super_sekrit_sauce
echo "2:$ABC:$final_output"
Run Code Online (Sandbox Code Playgroud)

哪个输出:

1::the output is some output
2:ABC:the output is some output
Run Code Online (Sandbox Code Playgroud)

如果你真的只想打电话一次,你可以这样做:

#!/usr/bin/env bash

test_this(){
  export ABC="ABC"
  export OUTPUT="some output"
}

test_this
final_output="the output is ${OUTPUT}"
echo "1:$ABC:$final_output"
Run Code Online (Sandbox Code Playgroud)

换句话说,使用与其他信息相同的方法来提取输出.

  • @robert:看到更新.你真正的问题是`$()`必然会创建一个子进程,因此任何环境变化都将限制在该子进程中.如果您直接调用该函数,则可能会影响当前的流程环境. (2认同)