Bash関数をインラインでエクスポートする

Bash関数をインラインでエクスポートする

私はこれを持っています:

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

export -f foo;

私は次のようなものを探しています:

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

しかし、構文が正しくありません。

私が見つけた一つの技術は次のとおりです。 ファイルのすべてのBash機能を1行にエクスポートするには?

これは私がこれを行うことができることを意味します:

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

-aたとえば、オプションの状態を確認してオプションが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がオンになっていないことを確認することです。それ以外の場合は、完了したらオフにする必要があります。

関連情報