私のbash機能を外部プログラムに通知するにはどうすればよいですか?

私のbash機能を外部プログラムに通知するにはどうすればよいですか?

私はbash機能を持ってfooいて、bar私の~/.bashrc

関数は、他のコマンドを引数の1つとして使用するfoo外部コマンドを呼び出します。ext_command私はbarそのコマンドに渡したいこと、つまり私のコマンドは.bashrc次のようになりたいです。

bar() {
...
}
foo() {
 ext_command --invoke bar
} 

ただし、外部コマンドがシェルスクリプトではないため、機能しませんbar。この問題をどのように解決しますか?

私が代わりにしたい

ext_command --invoke "bash -c 'bar'"

しかし、この呼び出しでは、Bashはインタラクティブシェルとして実行されないのでbar

したがって、私の問題を解決する1つの方法は、Bashをインタラクティブシェルとして強制することだと思います。残念ながら、その方法がわからない。

確かに効果があると思われる別のアプローチは次のとおりです。

ext_command --invoke "bash -c 'source ~/.bashrc; bar'"

しかし、何らかの理由でこれは動作せず、実際に実行されます。

bash -c 'source ~/.bashrc; bar'

対話型bashセッションで提供

bash: bar: command not found

fooとにかく、私はこのソリューションがどんなファイルから来ても作業したいので、このソリューションは好きではありません。

答え1

通常、次のオプションがあります。

  1. 関数をコマンドで書き換えます。別のスクリプトです。一般的な慣行は、ディレクトリを維持し、これ~/bin$PATH
  2. 関数を環境にエクスポートし、他のシェルがそこから取得できるようにします。バラよりBashで関数を「エクスポート」できますか?
  3. アクセス可能な機能にこだわりますbarが、そこから機能を得ることが~/.bashrc最善の解決策ではないかもしれません。独自のファイルに入れて~/binそこからインポートできます。これにより、作業が簡単になります。
  4. 可能であれば、他の方法で関数にロジックを提供してくださいext_commandfooここでドキュメントを見てください。

関連情報