web-dev-qa-db-ja.com

スクリプトを複数回調達することは避けてください

現時点では、Macで端末を開くと、自動的に次のように呼び出されます。

source ~/.bash_profile

しかし、私を困惑させているのは、私のシェルが~/.bashrcまたは~/.profileからコンテンツを継承していないように見えることです。しかし、それは典型的なことかもしれません。

sourceまたは.を使用して継承するスクリプトがいくつかあります。これらの呼び出しを~/.bash_profileに入れると、新しいシェルウィンドウのロードに時間がかかる場合があり、場合によっては3〜4秒かかり、古くなります。これらのスクリプトを1度だけソースし、~/.bash_profileファイルになんらかの方法で継承させるいくつかの方法があると思います。

〜/ .bash_profileからsource〜/ .bashrcまたはsource〜/ .profileを呼び出すことは、私がやりたいことではなく、おそらく悪い考えです。新しいシェルごとにロードが遅いという問題を解決できないため、これは私がやりたいことではありません。

エコーステートメントをいくつか追加しました。新しいbashターミナルウィンドウを開くたびに、これがログに記録されます。

starting to load /etc/profile
finished loading /etc/profile
starting to load bash_profile
finished loading bash_profile

それは理にかなっていますが、残念なことです。新しいシェルが開かれるたびにこれらをロードする必要がありますか?毎回すべてをリロードする必要がないように、なぜそれはいくつかの派手な継承を行うことができないのですか?

問題を説明するビデオデモを作成しました。私は定期的に使用する4つの端末アプリケーションを持っています:

terminal.app                  # misbehaves
iterm2                        # misbehaves
webstorm terminal emulator    # misbehaves
vscode terminal emulator      # behaves!

VSCodeは実際には私が望むように動作します。親シェルに〜/ .bash_profileをロードすることでこれを実行し、vscodeが起動したときに一度だけ実行すると思います。アプリ内のすべてのターミナルウィンドウは、その1つの親シェルのサブシェルになります。

うまくいけば、このビデオで問題が明らかになります:https://www.useloom.com/share/4e62f0cb24434c4a83b8bd32844b596a

これは正当な問題です。ほとんどのターミナルアプリケーションはこのすべてのことを間違っていますが、奇跡的に、MicrosoftのVSCodeが実際にこのすべてのことを正しく行っているようです。この問題を参照してください。

https://youtrack.jetbrains.com/issue/WEB-3139

2
Alexander Mills

今朝、私はたくさんの個人情報を私のbash_profilebashrcを追加し、privatercと呼ぶ新しいファイルに追加しました。

privatercファイルで、次の変数を設定しました。

PRIVATERC_RUN=yes 

今私のbash_profileこの行を追加しました:

[[ $PRIVATERC_RUN != yes && -f ~/.privaterc ]] && source ~/.privaterc

これにより、privatercは、以前にこのシェルでソースされたことがない場合にのみソースされます。


また、あなたが見ているプロフィールの奇妙さについては、コメントでリンクした記事は、macについて次のように述べています:

Mac OS X —例外

ターミナルウィンドウのガイドラインの例外は、Mac OS XのTerminal.appです。これは、新しいターミナルウィンドウごとにデフォルトでログインシェルを実行し、.bashrcではなく.bash_profileを呼び出します。他のGUIターミナルエミュレータも同じことをするかもしれませんが、ほとんどはそうしない傾向があります。

1
jesse_b

ソーシング側ではなく、ソーシング側でクリシェを書くほうがいいのではないかと思います。 (Cヘッダーファイルと同様)

[[ "${_NAME_OF_THIS_LIBSCRIPT:-""}" == "yes" ]] && return 0
_NAME_OF_THIS_LIBSCRIPT=yes

これにより、スクリプトファイルをソースするたびに同じボイラープレートを繰り返す必要がなくなります。スクリプトファイルには、複数の場所で共有するためのものを含める必要があります。それとも私は何かが足りないのですか?正直なところ、私はbashのプログラミングマスターではないので、他の人からの洞察を得たいと思っています。

4
Hiroshi_U

Rcファイルに一意の変数(1バイト以上の長さ)を入れ、bash_profileをソーシングする前に、長さが0より大きいかどうかを確認します。

if [ ! X”” = X”$uniq_var” ] ; then . ~/.bash_profile ; fi

MacOSではログインシェルとしてbashを設定しただけで、この問題はありませんでした。おそらく彼らはまた何かを変えたのでしょう。

1
user2497