Zsh が ~/.profile にアクセスしない

Zsh が ~/.profile にアクセスしない

Ubuntu システムに zsh をインストールしました。zsh は init 時に ~/.profile を実行していないようです。私の理解では、これは自動動作のはずです。何が足りないのでしょうか?

答え1

.profile.zprofile

zsh は、ログイン シェルとして呼び出されると、~/.zprofileではなく を実行します~/.profile。その理由は、zsh には標準シェルとの非互換性が十分にあり、スクリプトが壊れてしまうからです。

Zsh は、または~/.profileとして呼び出された場合は実行されます。ただし、ログイン時に zsh プロンプトを表示することが目的である場合、これは役に立ちません。shksh

/bin/shログイン シェルを作成して、export SHELL=/bin/zshに含めることができます~/.profile。その後、ターミナルを開くと、ターミナルは zsh を起動します (設定に従わないいくつかのターミナル エミュレーターを除く)。ただし、ssh 経由でログインすると、$SHELLが引き続き表示されます。これは、 の末尾にを含めることで解決できます(これにより、実行中のシェルが zsh に置き換えられます)。ただし、対話型ログインの場合にのみこれを実行し、X セッションの開始などの他のスクリプトから が組み込まれる場合は実行しないように注意する必要があります( によって取得された親プロセスの名前が であるかどうかは良いテストです。 またはである場合は、 を実行しても安全です)。shexec zsh~/.profile~/.profileps -o comm= $PPIDsshdsuexec

zsh と連携して実行するための最も簡単な解決策は、実行中に sh エミュレーション モードに入る を~/.profile作成することです。~/.zprofile~/.profile

emulate sh
. ~/.profile
emulate zsh

十分に新しい zsh (Ubuntu の場合、これは lucid 以降を意味すると思います) をお持ちの場合は、これを に簡略化できますemulate sh -c '. ~/.profile'

.zprofile.zshrc

ファイル~/.profileログインシェル。ログイン シェルは、テキスト コンソールや ssh など、テキスト モードでログインしたときに最初に起動されるプロセスです。ほとんどの Linux マシンでは、デフォルトでログイン シェルは bash ですが、 コマンドchsh、または Ubuntu の「ユーザー設定」などの他のツールを使用して変更できます。ログイン シェルの場合、bash は~/.bash_profileが存在する場合は と を読み取りますが~/.profile、zsh は のみを読み取ります~/.zprofile(構文が従来の sh と完全に互換性がないため)。ほとんどの構成では、~/.profileグラフィカル ディスプレイ マネージャーにログインすると、X セッション起動スクリプトによって も読み込まれます。

ターミナル エミュレータを起動してシェル プロンプトが表示されるか、または明示的にシェルを起動すると、ログイン シェルではないシェルが起動します。~/.profile(または~/.zprofile) はログイン時に実行するコマンド用なので、非ログイン シェルはこのファイルを読み取りません。代わりに、対話型の zsh を起動すると が読み取られます~/.zshrc。(Zsh は~/.zshrc、ログイン シェルかどうかに関係なく、すべての対話型シェルを読み取ります。奇妙なことに、bash は~/.bashrcログイン シェルを読み取りません。)

通常、~/.profile環境変数の定義が含まれており、ログイン時に 1 回実行するプログラムやセッション全体で実行するプログラムを起動する場合があります。~/.zshrcエイリアスと関数の定義、シェル オプションの設定、補完設定、プロンプト設定、キー バインディングなど、シェル インスタンスごとに実行する必要があるものが含まれています。

答え2

せっかちな人のための短い答え:

  1. ~/.profileログイン時に読み込まれませんzsh
  2. zshログイン時に読み込まれます~/.zprofile
  3. zsh~/.zshrc新しいターミナルセッションを開始するときに読み込まれます。

さらに詳しい情報が必要ですか? Gilles の素晴らしい回答をご覧ください!

答え3

Gilles の回答に加えて、比較的新しいバージョンの zsh を使用すると、次の操作を実行できます。

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

...これにより、zsh の sh モードが有効になった状態で .profile ファイルがソース化されます。これはソース化中のみアクティブになります。そのため、ソース化後に再度再生するために現在のオプション状態を保存する必要はありません。

答え4

翻訳私が手元に持っているドキュメントに/etc/profileは、~/.profileログインシェルについてのみ記載されています。シュ/ksh互換モード。

% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'

ネイティブ モードのログイン シェル (argv[0] が で始まる-) は使用しません~/.profile(ただし、使用されます~/.zprofile):

% zsh -c 'exec -a -zsh zsh' </dev/null

(出力なし)

シュ/ksh互換モードのログインシェルは .profile を使用します:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...

関連情報