私の職場の制約のため、これはすべてのユーザーのデフォルトシェルであり、それを非対話型シェルとして使用する必要がありますtcsh
(つまり、initファイル内のプロジェクト全体でほとんどの環境設定を実行します)。しかし、私はそれをインタラクティブシェルとして使用したいと思います。tcsh
tcsh
zsh
tcsh
zshに切り替えるときに環境を継承するために、zsh
私は通常最初にインタラクティブシェルを起動してtcsh
からを使用してzshに切り替えますexec zsh
。これはうまくいくようです。
tcsh
ただし、時には初期化ファイルを更新し、それに応じて環境を更新する必要があります。ランニングでzsh
シェル。私はこの問題を解決する最善の方法はtcsh
ソースのinitフィルタに切り替えてから再度切り替えることだと思いますzsh
。
実際、私は次のアプローチを使用します
> # Running from a zsh interactive shell.
> # Various tcsh and zsh init files have been updated
> exec tcsh
> exec zsh
> # I am back to zsh with the updated environment
しかし、いくつかのことを知りたいです。
崩れる方法はないでしょうか?
> exec tcsh > exec zsh
注文になりますか?私は以前試しました:
> exec tcsh; zsh > exec tcsh; exec zsh
しかし、それらのどれも働かないようです。動作しているように見える唯一のこと
> exec tcsh & exec zsh
しかし、これが私のニーズに合うかどうかはわかりません。
非対話型環境(例:もう一度ログインしても同じことそれから
tcsh
zshに切り替えます)より一般的には、対話型タスクと非対話型タスクに異なるシェルを使用し、次の点を確認してください。対話型シェルは、非対話型シェル環境で開始されます。? (この環境ビットは対話型シェルの初期化ファイルで変更できます)
ベストアンサー1
次のように、2つのexecコマンドを単一のコマンドに縮小できます。
exec tcsh -c zsh
次のコマンドを使用して、現在のzshプロセスで環境を更新できます。
eval $(env -i tcsh -c env)
を使用すると、env -i
次のコマンドが空の環境で実行されます。これで tcsh が実行され、起動ファイルが処理されます。その後、tcshオプションの別のコピーは-c
runですが、env
今回はコマンドがないため、tcshが設定した環境の現在の内容のみを印刷します。これにより、eval $(...)
zshは出力を解析します。
私のテストでは、zshが読み取り専用変数をenv -i
含む独自に設定する環境変数を設定しようとしないようにする必要がありました。_
これにより、少なくとも出力の一部を処理できずにevalが失敗します。