web-dev-qa-db-ja.com

Zshがヒットしない〜/ .profile

私はUbuntuシステムにzshをインストールしました。 zshはinitで〜/ .profileを実行していないようです。私の知る限りでは、これは自動的な振る舞いです。何が足りないの?

128
shmichael

.profile.zprofile

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

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

/bin/shをログインシェルにして、export Shell=/bin/zsh~/.profileを含めることができます。それから端末を開くと、端末はzshを起動します(いくつかの端末エミュレータは$Shell設定に従わない場合を除く)。しかし、sshを使ってログインしても、shは残ります。これは、exec zshの最後に~/.profileを含めることで解決できます(これは実行中のShellをzshに置き換える)だけで、Xセッション開始などの他のスクリプトから~/.profileが含まれる場合は注意してください。 (良いテストはps -o comm= $PPIDによって得られた親プロセスの名前です:もしそれがsshdsuなら、それはexecにしても安全です)。

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

emulate sh
. ~/.profile
emulate zsh

あなたが最近十分なzshを持っているなら(Ubuntu上で、それはlucid以来、つまり私は思う)、あなたはこれをemulate sh -c '. ~/.profile'に単純化することができます。

.zprofile.zshrc

ファイル~/.profileloginシェルによってロードされます。ログインシェルは、テキストモード(テキストコンソールや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には、エイリアスと関数の定義、シェルオプション設定、完了設定、プロンプト設定、キー割り当てなど、すべてのシェルインスタンスに対して実行する必要があることが含まれています。

183
Gilles

せっかちな人への簡単な答え:

  1. ログイン時に~/.profilezshによってロードされません。
  2. zshはログイン時に~/.zprofileをロードします。
  3. zshは、新しいターミナルセッションを開始するときに~/.zshrcをロードします。

もっと情報が必要ですか? Gillesのすばらしい答えを見てください。

56
Karl Morrison

Gillesの答えに加えて、かなり最近のバージョンのzshではこれを行うことができます。

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

...これは、zshのshモードを有効にして.profileファイルを取得します。そしてそれはソースの間だけアクティブです。そのため、ソーシング後に現在のオプション状態を再生するために現在のオプション状態を保存する必要はありません。

20
Frank Terbeck

私は.zprofile.profileとの互換性があります(PATHの変更のみを含みます)。したがって、以下を必要とするだけです。

ln -s .profile .zprofile
5
Igor Shubovych

私が手元に持っているzshのドキュメントには、sh/のログインシェルのための/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

(出力なし)

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

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