サブシェルに bash を継承して設定を完了させる方法は?

サブシェルに bash を継承して設定を完了させる方法は?

Gnu画面を実行する前にインポートするプロジェクト固有の設定ファイルがあります。

このファイルでは、テストコマンドと関連テストのbashコンプリートを設定しました。

次のようになります。

$PROJECT_HOME/app/bin/lib/behat_suites.sh  # _behat_suites() defined here
complete -F _behat_suites run_behat_suite
export -f _behat_suites

問題は、各画面が新しいシェルであり、complete -F設定を維持できないことです(残りの環境では維持されます。適切なサブシェルです)。

これはexport、関数が画面サブシェルに保持されますが、完了設定自体は維持されないことを意味します。

direnvのようなツールが不足しているか、私のユーザー〜/ .bashrcに設定を配置する場合は、サブシェルプロセスが完了した設定を継承する方法はありますか?

ベストアンサー1

これを簡単に行う方法はありません。complete -p親シェルの出力を子シェルに渡す必要があります。

まず、サブシェルに追加のコマンドを挿入できます。

$ bash --rcfile <(echo '. ~/.bash_profile')

complete -p今これを次のように紹介しようとすると:

$ bash --rcfile <(echo '. ~/.bash_profile'; while read line; do echo "$line"; done < <(complete -p))
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]

ほぼうまくいきますが、コマンドを入力したときに一気に動くようですcomplete。ファイルを中間ファイルとして使用しようとしても機能しません。

$ complete -p > /tmp/cmp.txt; bash --rcfile <(echo '. ~/.bash_profile'; echo '. /tmp/cmp.txt')
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]

なぜ失敗したのかを調べようとするだけでは、もはや物事を明らかにすることはできません。ここでは、以下を介してbashの詳細出力を有効にします-set -x

$ bash
$ set -x

次に、作成したばかりのファイルを取得します。

$ . /tmp/cmp.txt
+ . /tmp/cmp.txt
++ complete -F _manila manila
++ complete -F _minimal
complete: usage: complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
++ complete -F _command time
++ complete -F _command do
++ complete -o bashdefault -o default -o nospace -F __git_wrap_git_checkout gcob

したがって、特別なことが起こらない限り、出力に含まれるデータはこの特別な場合に移植可能であるようには見えませんcomplete -p

引用する

おすすめ記事