Ubuntuのシステムにzshをインストールしたところです。どうやらzshはinit時に~/.profileを実行していないようです。私の理解では、これは自動的に動作するはずです。何が足りないのでしょうか?
196 shmichael 2010-09-12
.profile対.zprofileの場合
Zsh はログインシェルとして起動されると ~/.zprofile ではなく ~/.profile を実行します。理由は、zsh にはスクリプトを壊すほどの標準シェルとの非互換性があるからです
Zsh は sh や ksh と呼ばれると ~/.profile を実行します。しかし、あなたの目的がログイン時に zsh のプロンプトを表示することであるならば、それは何の役にも立ちません
/bin/sh をログインシェルにして、export SHELL=/bin/zsh を ~/.profile に含めることができます。そうすると、ターミナルを開くと、ターミナルは zsh を起動します (一部のターミナルエミュレータは $SHELL の設定に従わないことを除いて)。しかし、ssh 経由でログインしても sh のままです。これは ~/.profile の最後に exec zsh を含めることで解決できます (これは実行中のシェルを zsh に置き換えます) が、これを行うのは対話的なログインの場合だけで、X セッションの開始のような他のスクリプトから ~/.profile が含まれている場合には行わないように注意する必要があります (良いテストは ps -o comm= $PPID で得られた親プロセスの名前です: sshd か su であれば exec が安全です)
zshで動作し、~/.profileを実行するための最も簡単な解決策は、~/.profileを実行している間にshエミュレーションモードに入る~/.zprofileを作成することです
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 を読みます。)
典型的には、~/.profileには環境変数の定義が含まれており、ログイン時に一度だけ実行したいプログラムやセッション全体で実行したいプログラムを起動することがあります
278 Gilles ‘SO- stop being evil’ 2010-09-12
せっかちな人のための短答
- ログイン時に
~/.profileがzshによって読み込まれない zshはログイン時に~/.zprofileをロードしますzshは、新しいターミナルセッションの開始時に~/.zshrcをロードします
もっと情報が必要ですか?ジルの見事な答えを見てください
111 Karl Morrison 2015-03-21
Gilles の回答に加えて、合理的な最新版の zsh を使えば、このようなことができます
[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'
…これはzshのshモードを有効にして.profileファイルをソースにします。そして、これはソース中のみ有効です。そのため、ソース生成後に再度再生するために現在のオプションの状態を保存する必要はありません
24 Frank Terbeck 2012-03-09
私は.zprofileを.profileと互換性があるので(PATHの変更のみを含む)、必要なのは.zprofileだけです
ln -s .profile .zprofile
5 Igor Shubovych 2015-04-14
私が手元にある zsh のドキュメントでは、sh/ksh 互換モードのログインシェルについては /etc/profile と ~/.profile のみが言及されています
% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'
ネイティブモードのログインシェル (argv[0] は - で始まる) は ~/.profile を使用しません (ただし ~/.zprofile を使用します)
% zsh -c 'exec -a -zsh zsh' </dev/null
(no output)
sh/ksh互換性モードのログインシェルは.profileを使用します
% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
1 Chris Johnsen 2010-09-12

