残念ながら、環境変数を設定するための完全に移植可能な場所はありません。最も近い2つのファイル~/.profile
は、従来の場所であり、多くのセットアップですぐに使用できるファイルと~/.pam_environment
、現代的でありふれたものですが、限られた代替ファイルです。
何を入れるか ~/.pam_environment
ファイル~/.pam_environment
は、PAMを使用し、このファイルが有効になっているすべてのログインメソッドによって読み取られます。これは、最近のほとんどのLinuxシステムに対応しています。
主な利点~/.pam_environment
は、(有効な場合)ユーザーのシェルが開始する前に読み取られるため、セッションタイプ、ログインシェル、その他の複雑さに関係なく機能することです。su -c somecommand
やなどの非対話型ログインでも機能しssh somecommand
ます。
の主な制限は~/.pam_environment
、複雑なシェル構文ではなく、単純な割り当てのみを配置できることです。このファイルの構文は次のとおりです。
- ファイルは行ごとに解析されます。
- 先頭の空白は無視されます。
- オプションで
export
、行を1つのスペース(タブではなく図に移動)で開始できます。
- その後、各行
VAR=VALUE
はVARが文字、数字、アンダースコアで構成される形式にする必要があります。
#
コメントを開始します。値に表示することはできません。
- VALUEが
'
or "
で始まり、別の同じ引用符が含まれている場合、VARは引用符の間の文字列に設定されます(2番目の引用符の後はすべて無視されます)。それ以外の場合、VARは=
記号の後の文字列に設定されます。
- がない
=
場合、変数は環境から削除されます。
そのため、逆に、~/.pam_environment
さまざまな状況で機能します。マイナス面として、変数の値を別の変数のベースにする(例:PATHにディレクトリを追加する)、コマンドの出力を使用する(例:ディレクトリまたはプログラムが存在するかどうかをテストする)文字(#'"
、改行)を値に入れることは不可能または面倒です。
何を入れるか ~/.profile
このファイルには、移植可能な(POSIX)sh構文が必要です。[[ … ]]
システムにこれらのシェルがあることがわかっている場合にのみ、kshまたはbash拡張(配列など)を使用してください/bin/sh
。
このファイルは、自動化されたアプリケーションのスクリプトによって読み取られる可能性があるため、出力を生成するプログラムやを呼び出すことはできませんexec
。テキストモードのログインでこれを実行する場合は、対話型シェルに対してのみ実行してください。例:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
これは、/bin/sh
ログインシェルとして使用し、お気に入りのシェルに切り替える例です。システム管理者が変更を許可していないときにログインシェルとしてbashを使用する方法も参照してください。
~/.profile
非グラフィカルログインで読み取られない場合
異なるログインシェルは異なるファイルを読み取ります。
ログインシェルがbashの場合
bashは、~/.bash_login
またはの~/.bash_profile
代わりに存在する場合に読み取ります~/.profile
。また、bash ~/.bashrc
は、対話式であってもログインシェルを読み取りません。これらの癖を二度と覚える必要がないようにするに~/.bash_profile
は、次の2行でを作成します。
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
bashを使用して環境変数を設定するために使用する必要があるセットアップファイルも参照してください。
ログインシェルがzshの場合
Zshはを読み取りますが~/.zprofile
、~/.zlogin
ではありません~/.profile
。Zshの構文はshとは異なりますが~/.profile
、shエミュレーションモードで読み取ることができます。あなたはこれをあなたのために使うことができます~/.zprofile
:
emulate sh -c '. ~/.profile'
〜/ .profileにヒットしないZshも参照してください。
ログインシェルが他のシェルである場合
ここで/bin/sh
は、ログインシェルとして使用したり、お気に入りのシェル(魚など)を対話型シェルとしてのみ使用したりする以外に、できることはあまりありません。それは私がzshでやっていることです。から別のシェルを呼び出す例については、上記を参照してください~/.profile
。
リモートコマンド
インタラクティブシェルを経由せずにリモートコマンドを呼び出す場合、すべてのシェルがスタートアップファイルを読み取るわけではありません。
ENV
あなたがそれを渡すことに成功した場合、Kshは変数で指定されたファイルを読み取ります。
Bash ~/.bashrc
は、対話型ではなく(!)、その親プロセスがrshd
or と呼ばれる場合に読み取りますsshd
。あなたを開始することができるように~/.bashrc
して
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zshは~/.zshenv
起動時に常に読み取ります。他の変数を設定したサブシェルであっても、これはzshのすべての単一インスタンスによって読み取られるため、注意して使用してください。zshのは、ログインシェルであり、あなたはガードを使用し、唯一のリモートコマンド用に設定された変数にそれを使用したい場合は、次の中でいくつかの変数を設定する~/.profile
など、MY_ENVIRONMENT_HAS_BEEN_SET=yes
、そして読書の前に、このガードを確認してください~/.profile
。
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
グラフィカルログインの場合
多くのディストリビューション、ディスプレイマネージャー、デスクトップ環境での実行を手配 ~/.profile
は、起動スクリプトから明示的にソースを取得するか、ログインシェルを実行することにより、ます。
残念ながら、distro / DM / DEの組み合わせを処理する一般的な方法はありません。 ~/.profile
読み取られないはありません。
で開始された従来のセッションを使用する場合~/.xsession
は、ここで環境変数を設定する必要があります。調達~/.profile
(つまり. ~/.profile
)によってそれを行います。一部のセットアップでは、デスクトップ環境の起動スクリプトが~/.profile
再度ソースされることに注意してください。