特定のファイルを取得するために新しいzshインスタンスを起動する方法は?

特定のファイルを取得するために新しいzshインスタンスを起動する方法は?

/venv/bin/activateいくつかの環境変数を設定するスクリプトがあります。 zshを起動してこのスクリプトをインポートしてから、一般的な対話型セッションを続行する方法を探しています。このセッションを終了すると、戻ってくるセッションは環境の変更を認識できませんactivate。どのようにzshをこのように呼び出すことができますか?

(これは次のとおりです。これただし、bashの代わりにzshを使用するという点を除いてください。 )

答え1

スクリプトが環境変数のみを設定している場合は、activateシェルからその変数を読み取り、新しい対話型zshインスタンスを実行できます。

sh -c '. /venv/bin/activate; exec zsh -i'

ラッパーシェルは、スクリプトが互換性があるかどうかなど、sh解析可能な任意のシェルに置き換えることができます。/venv/bin/activatezshactivate

環境変数に加えて、インタラクティブzshインスタンスは、プロセスIDとリソース制限(ulimit …)とシグナルの無視(trap '' …)などの他のいくつかのプロセス設定を継承します。一方、シェル変数(エクスポートされていないvar=…場合var)、シェルオプション(set -…またはshopt …)、キーバインディング、エイリアス、関数定義など、シェル自体の設定は保持されません。

.zshrc明らかに、これはスクリプトによって設定された環境変数を無視しても機能しませんactivate。これが理由の一つです.*shrcファイルは環境変数を設定しないでください。

答え2

使用ZDOTDIR

~/venv_startupたとえば、.zshenvと.zshrcという2つのファイルを含む(一時的な可能性がある)ディレクトリを作成します。 .zshenv ファイルには次の内容が含まれています。

source ~/.zshenv
source /venv/bin/activate

そして.zshrcは言います

source ~/.zshrc

今zshを呼び出して

zsh -c "ZDOTDIR=~/venv_startup zsh"

これはzshに「ここから.zshenvファイルと.zshrcファイルをインポートすることから始めず、$HOME代わりにこれらの名前のファイルをインポートしてください」と言います。とにかくそれが/venv_startupソースの版であるので最終的な効果はシェルが動く/venv_startup$HOME

source /venv/bin/activate

zshenvとzshrcの実行の間。その後は一般的な対話型セッションです。

関連情報