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