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