ubuntu – Zshが~/.profileをヒットしない

ubuntu zsh

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

  196  shmichael  2010-09-12


ベストアンサー

.profile.zprofileの場合

Zsh はログインシェルとして起動されると ~/.zprofile ではなく ~/.profile を実行します。理由は、zsh にはスクリプトを壊すほどの標準シェルとの非互換性があるからです

Zsh は shksh と呼ばれると ~/.profile を実行します。しかし、あなたの目的がログイン時に zsh のプロンプトを表示することであるならば、それは何の役にも立ちません

/bin/sh をログインシェルにして、export SHELL=/bin/zsh~/.profile に含めることができます。そうすると、ターミナルを開くと、ターミナルは zsh を起動します (一部のターミナルエミュレータは $SHELL の設定に従わないことを除いて)。しかし、ssh 経由でログインしても sh のままです。これは ~/.profile の最後に exec zsh を含めることで解決できます (これは実行中のシェルを zsh に置き換えます) が、これを行うのは対話的なログインの場合だけで、X セッションの開始のような他のスクリプトから ~/.profile が含まれている場合には行わないように注意する必要があります (良いテストは ps -o comm= $PPID で得られた親プロセスの名前です: sshdsu であれば 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


せっかちな人のための短答

  1. ログイン時に~/.profilezshによって読み込まれない
  2. zshはログイン時に~/.zprofileをロードします
  3. 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


タイトルとURLをコピーしました