現時点では、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が実際にこのすべてのことを正しく行っているようです。この問題を参照してください。
今朝、私はたくさんの個人情報を私のbash_profile
とbashrc
を追加し、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ターミナルエミュレータも同じことをするかもしれませんが、ほとんどはそうしない傾向があります。
ソーシング側ではなく、ソーシング側でクリシェを書くほうがいいのではないかと思います。 (Cヘッダーファイルと同様)
[[ "${_NAME_OF_THIS_LIBSCRIPT:-""}" == "yes" ]] && return 0
_NAME_OF_THIS_LIBSCRIPT=yes
これにより、スクリプトファイルをソースするたびに同じボイラープレートを繰り返す必要がなくなります。スクリプトファイルには、複数の場所で共有するためのものを含める必要があります。それとも私は何かが足りないのですか?正直なところ、私はbashのプログラミングマスターではないので、他の人からの洞察を得たいと思っています。
Rcファイルに一意の変数(1バイト以上の長さ)を入れ、bash_profileをソーシングする前に、長さが0より大きいかどうかを確認します。
if [ ! X”” = X”$uniq_var” ] ; then . ~/.bash_profile ; fi
MacOSではログインシェルとしてbashを設定しただけで、この問題はありませんでした。おそらく彼らはまた何かを変えたのでしょう。