内联导出 bash 函数

内联导出 bash 函数

我有这个:

foo(){
   install_ores_gitflow;
   command foo "$@"
}

export -f foo;

我正在寻找这样的东西:

export foo(){
   install_ores_gitflow;
   command foo "$@"
}

但该语法不正确。

我发现的一项技术是这样的: 如何在一行中导出一个文件中的所有 Bash 函数?

这意味着我可以这样做:

set -a;

foo(){
  install_ores_gitflow;
  command foo "$@"
}

set +a;

但我不喜欢这个解决方案,因为采购脚本可能有set -a这意味着我的脚本将覆盖非常糟糕的脚本。

答案1

这是一个令人讨厌的黑客,但至少它允许你把export命令多于更容易看到的函数定义。

# a function to create a dummy function and export it
export_function() { eval "function $1 { :; }; export -f $1"; }

# then

export_function foo
foo() { echo "here is the *real* function"; }

答案2

为什么不使用-aeg 检查选项的状态echo $-,这样如果设置了就不需要执行任何操作?

答案3

好吧,我认为这是一种明智且可靠的方法:

#!/usr/bin/env bash

if [[ ! "$SHELLOPTS" =~ "allexport" ]]; then
    set -a;
    all_export=nope;
fi


ores_git_merge_with_integration(){
   install_ores_gitflow;
   command "$FUNCNAME" "$@"
}

ores_git_tools(){
   install_ores_gitflow;
   command "$FUNCNAME" "$@"
}


if [ "$all_export" == "nope" ]; then
  set +a;
fi

在您的 bash 脚本中,可能可以将所有要导出的函数分组并用 set -a / set + 命令包围它们。

检查环境变量的目的$SHELLOPTS是查看 set -a 是否未打开,如果未打开,则需要在完成后将其关闭。

相关内容