質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

4回答

3948閲覧

.zshenvと.zshrcについて

shohei_nagamura

総合スコア13

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2022/01/08 14:22

前提・実現したいこと

現在はzshを使用ししてPATHやカスタマイズは.zshrcに記載しているのですが、
ある記事を読みまして環境変数やPATHのexportは.zshenvに記載し、
エイリアスやカスタマイズ関係は.zshrcに記載と書いてあったんですが、
記事の通り記載し直した方が良いのでしょうか??
また、.zshenvが現在ないのですが、手動で作って良いのでしょうか?

補足情報(FW/ツールのバージョンなど)

macOS
zsh

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

AppleDeveloper開発者向けの資料に、実行される順番が書かれていました。
参考にしてください。

/etc~/
①/etc/zshenv②~/.zshenv
③/etc/zprofile④~/.zprofile
⑤/etc/zshrc⑥~/.zshrc
⑦/etc/zlogin⑧~/.zlogin

補足として、/etc/zshrcの最後に/etc/zshrc_Apple_termenalが呼ばれている。

投稿2022/01/08 15:45

technocore

総合スコア7337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

.zlogin ログインシェルの時だけ実行
.zshrc 対話型シェルの時だけ実行
.zshenv 対話型シェルだけでなくzshスクリプトの場合でも実行

と、呼ばれるタイミングが違います。.zshenvはZshスクリプト実行ごとに呼ばれるので、例えばログインシェルはBashだが、Zshスクリプトではそれと違う環境変数を使いたいとかの場合に使うのでしょうか。

PATHなど環境変数の設定であれば、ログインシェルで一度だけ実行すれば、そこから起動されるプロセスに引き継がれるので、.zloginに書くのが普通かと思います。

.zshenvが現在ないのですが、手動で作って良いのでしょうか?

はい。

投稿2022/01/08 14:58

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2022/01/08 15:09

親から継承したものに左右されず固定の設定を担保したい場合でしょうね。
doda

2022/01/10 08:17

.zloginは実行されるタイミングが遅いので、(.zshenvに書かない場合は).zprofileで設定する方が好みです。 .zshrcの中で外部コマンドを実行する時にも影響を与えたいという理由です。
otn

2022/01/10 11:59

> .zshrcの中で外部コマンドを実行する時にも影響を与えたいという理由です。 .zprofileと.zloginで.zshrcとの前後関係が違うとは知りませんでした。ありがとうございます .zshenvに書く物をちょっと考えてみたのですが、環境変数のうち、 「対話型シェル起動後に手動で変更する可能性があるが、そこから起動する全シェルスクリプトで共通して変更前の値で固定したい」 という物がちょっと思いつかないです。まあでも、そういう機能がある以上、あるのでしょうけど。
doda

2022/01/10 14:23

> 「対話型シェル起動後に手動で変更する可能性があるが、そこから起動する全シェルスクリプトで共通して変更前の値で固定したい」 .zshenvの役目として、これは多分誤解だと思います。 ログインシェル等の対話型シェルを経ず、非対話型のシェルが直接起動されるケースが色々考えられます。 例えば私の回答でも書いたようにリモートからのsshによるコマンド実行が有りますし、他にもcronから起動される場合や、~/.forwardでスクリプトを起動するというのも考えられます。 このような場合にも共通して設定されて欲しい物は~/.zshenvに書く必要があります。
otn

2022/01/10 16:03

なるほど。Bashユーザーな物で、sshは考えが及びませんでした。ありがとうございます(Bashだとsshのコマンド実行でも.bashrcを読む)。しかし全スクリプトに効いちゃうので何を書くかは難しい。 他は、cronからの実行で必要な環境変数はcrontabに書くし、.forwardだときっと専用スクリプトしか書かないのでその中に書く。
guest

0

ある記事を読みまして環境変数やPATHのexportは.zshenvに記載し、

エイリアスやカスタマイズ関係は.zshrcに記載と書いてあったんですが、

私もこのルールと同じように、PATH等の環境変数は~/.zshenvに書き、エイリアスや補完設定などのインタラクティブシェル特有の設定を~/.zshrcに書いています。

PATH~/.zshenvに書くようにしている理由ですが、リモートからssh server commandとした時にcommandを設定したPATHから検索して欲しいからです。
sshでリモートから直接コマンドを実行した場合は~/.zshenvのみ実行されるので、PATHの設定を~/.zshrc等に書いた場合はシステムのデフォルトのPATHに含まれないコマンドはフルパスで指定する必要が出て来てしまいます。

他の環境変数も同様に、リモートからsshでコマンドを直接実行した時にも影響を与える為に~/.zshenvに書いています。

投稿2022/01/10 08:14

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

~/.zshenv は手動で作ってよいです。
~/.zshrc はzshがインタラクティブシェルとして起動したときに実行されますが、~/.zshenv はどんな場合にも最初に実行されます。たとえばシェルスクリプトの実行のために新しいzshが起動したときなどでも。ですからシェルスクリプトの実行にも必要な環境変数などは~/.zshenvで設定してあげれば良いというわけですね。

ただし当然ですがユーザーのホームディレクトリの~/.zshrcは他のユーザーには影響が及びません。
全ユーザーが対象の設定は/etc/zshenvに書きます。
(もしかしたら/etc/zsh/zshenvかもしれません)

投稿2022/01/08 14:52

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問