実行中のシェルが呼び出しを再生成するメカニズムはありますか?
場合によっては、変数または設定ファイルを変更して再度実行するには、source
ファイルを手動で起動する必要があります。PATH
私はこれが主にインタラクティブシェルに適用されると思います。
私はOS Xでbash 4を使用していますが、問題はこれに限定されません。
答え1
はいexec bash
。変数と関数をクリーンアップします。新しく開かれたファイルディスクリプタ(使用)またはエクスポートされた変数をクリーンアップすることはできませんが、exec $someNumber<>somefile
新しいファイルを開くことはめったに使用されず、起動exec
ファイル(実行時にロードされますexec bash
)には興味のある環境変数(たとえばPATH
)があります。彼らが入ってほしい状態です。
(通常のシェルを実行すると、現在のシェルに他のシェルが接着するため、再度実行するbash
必要があるという欠点があります。)exit
追加の変数や関数のクリーンアップに気を使わない場合は、ドットファイルを再ロードするだけです。
~/.bashrc
頻繁に編集してリロードするので、キーボードショートカットの組み合わせがあります。
bashrcEdit() { $EDITOR "$HOME/.bashrc"; }
bind -x '"\C-e": bashrcEdit && bashrcReload'
単純なリロードの場合:
bind -x '"\C-o": bashrcReload;'
(私のリロード機能は次のとおりです。
bashrcReload() { unset bashrcSourced; unset PROFILE_SOURCED; source "$HOME/.bashrc"; }
だけでなく:
source "$HOME/.bashrc";
unset
この変数(エクスポートされていない最初の-for .bashrc
、2番目にエクスポートされた-for .profile
)が私の設定で二重埋め込みガードとして機能するため、sがあります。これらのunset
変数がなければ、source
ingは.bashrc
私の設定では機能しません。 )
正しいことをしなさい
徹底したいならできます。
- .bashrcの終わりに環境のスナップショットを撮ってから再ロードしてください。完璧に行うことができます。
- ファイルディスクリプタが開いているスナップショット(その後、他のすべてのファイルディスクリプタを閉じます。これは完璧なソリューションではなく、完璧なソリューションにはなりません)
これを最後に追加します.bashrc
。
#Take a snapshot of the env and fds
envSnap() {
export FDS="$(/bin/ls /proc/$$/fd/)"
export ENV="$(export -p)"
}
#Restore env, close extra fds, and re-exec bash
envRestore(){
exec env - ENV="$ENV" bash --noprofile -c '
eval "$ENV"
for fd in `{ /bin/ls /proc/$$/fd; echo "$FDS"; } | sort | uniq -u`; do
eval "exec $fd>&-"
done
exec bash
'
}
#Take the snapshot now
envSnap
これでenvRestore
、環境をほぼ完全に復元できます。
たとえば、次のような場合:
export FOO=bar
touch file
exec 5<file
その後、引き続きexec bash
インクルード
/bin/ls /proc/self/fd
5とecho $FOO
印刷が表示されますbar
。
envRestore
ただし、代わりにこれを行うと(bashが通常fd 5で開かない限り)、5が含まれてはならず、空白行がexec bash
印刷されるはずです。/bin/ls/ /proc/self/fd
echo $FOO
(ファイルディスクリプタは弱点です。追加のファイルディスクリプタを閉じても、元のファイルディスクリプタがリダイレクトされないか、ファイルディスクリプタが指すvtableエントリが何らかの方法で変更されず、ファイルの読み取りまたは書き込みが変更されないという保証はないためです。動作します)。