
Ubuntu システムに zsh をインストールしました。zsh は init 時に ~/.profile を実行していないようです。私の理解では、これは自動動作のはずです。何が足りないのでしょうか?
答え1
.profile
対.zprofile
zsh は、ログイン シェルとして呼び出されると、~/.zprofile
ではなく を実行します~/.profile
。その理由は、zsh には標準シェルとの非互換性が十分にあり、スクリプトが壊れてしまうからです。
Zsh は、または~/.profile
として呼び出された場合は実行されます。ただし、ログイン時に zsh プロンプトを表示することが目的である場合、これは役に立ちません。sh
ksh
/bin/sh
ログイン シェルを作成して、export SHELL=/bin/zsh
に含めることができます~/.profile
。その後、ターミナルを開くと、ターミナルは zsh を起動します (設定に従わないいくつかのターミナル エミュレーターを除く)。ただし、ssh 経由でログインすると、$SHELL
が引き続き表示されます。これは、 の末尾にを含めることで解決できます(これにより、実行中のシェルが zsh に置き換えられます)。ただし、対話型ログインの場合にのみこれを実行し、X セッションの開始などの他のスクリプトから が組み込まれる場合は実行しないように注意する必要があります( によって取得された親プロセスの名前が であるかどうかは良いテストです。 またはである場合は、 を実行しても安全です)。sh
exec zsh
~/.profile
~/.profile
ps -o comm= $PPID
sshd
su
exec
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
せっかちな人のための短い答え:
~/.profile
ログイン時に読み込まれませんzsh
。zsh
ログイン時に読み込まれます~/.zprofile
。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...