正しいことをしなさい

正しいことをしなさい

実行中のシェルが呼び出しを再生成するメカニズムはありますか?

場合によっては、変数または設定ファイルを変更して再度実行するには、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変数がなければ、sourceingは.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/fd5とecho $FOO印刷が表示されますbar

envRestoreただし、代わりにこれを行うと(bashが通常fd 5で開かない限り)、5が含まれてはならず、空白行がexec bash印刷されるはずです。/bin/ls/ /proc/self/fdecho $FOO


(ファイルディスクリプタは弱点です。追加のファイルディスクリプタを閉じても、元のファイルディスクリプタがリダイレクトされないか、ファイルディスクリプタが指すvtableエントリが何らかの方法で変更されず、ファイルの読み取りまたは書き込みが変更されないという保証はないためです。動作します)。

おすすめ記事