対話型および非対話型タスク用のさまざまなシェル

対話型および非対話型タスク用のさまざまなシェル

私の職場の制約のため、これはすべてのユーザーのデフォルトシェルであり、それを非対話型シェルとして使用する必要がありますtcsh(つまり、initファイル内のプロジェクト全体でほとんどの環境設定を実行します)。しかし、私はそれをインタラクティブシェルとして使用したいと思います。tcshtcshzsh

tcshzshに切り替えるときに環境を継承するために、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

しかし、いくつかのことを知りたいです。

  1. 崩れる方法はないでしょうか?

    > exec tcsh
    > exec zsh
    

    注文になりますか?私は以前試しました:

    > exec tcsh; zsh
    > exec tcsh; exec zsh
    

    しかし、それらのどれも働かないようです。動作しているように見える唯一のこと

    > exec tcsh & exec zsh
    

    しかし、これが私のニーズに合うかどうかはわかりません。

  2. 非対話型環境(例:もう一度ログインしても同じことそれからtcshzshに切り替えます)

  3. より一般的には、対話型タスクと非対話型タスクに異なるシェルを使用し、次の点を確認してください。対話型シェルは、非対話型シェル環境で開始されます。? (この環境ビットは対話型シェルの初期化ファイルで変更できます)

ベストアンサー1

次のように、2つのexecコマンドを単一のコマンドに縮小できます。

exec tcsh -c zsh

次のコマンドを使用して、現在のzshプロセスで環境を更新できます。

eval $(env -i tcsh -c env)

を使用すると、env -i次のコマンドが空の環境で実行されます。これで tcsh が実行され、起動ファイルが処理されます。その後、tcshオプションの別のコピーは-crunですが、env今回はコマンドがないため、tcshが設定した環境の現在の内容のみを印刷します。これにより、eval $(...)zshは出力を解析します。

私のテストでは、zshが読み取り専用変数をenv -i含む独自に設定する環境変数を設定しようとしないようにする必要がありました。_これにより、少なくとも出力の一部を処理できずにevalが失敗します。

おすすめ記事