この質問はすべてを教えてくれます。私は現在Arch Linuxとzshを使用していますが、(少なくとも)VTとxtermsの両方で動作し(好ましくは)ディストリビューションまたはシェルを切り替えるときに動作し続けるソリューションが必要です。
さまざまなディストリビューションのドキュメントで、この質問に対する非常に異なる回答を聞きました。 Ubuntuは「.pam_environmentを使用してください」と言います。私は彼らがArchが推奨するものがシェルに依存していると思います。現在はすべて入れました。。輪郭シェルが何らかの理由でそれを取得できない場合(例:bash、.bash_profileが存在する場合)、手動でインポートしてそれを置き換えます。しかし、もっと良い方法があるようです。
ベストアンサー1
残念ながら、環境変数を設定できる完全に移植可能な場所はありません。最も近い2つのファイルは次のとおりです。~/.profile
は、さまざまな設定でデフォルトで機能する既存の場所です。~/.pam_environment
、現代的で一般的ですが、限られた選択肢です。
何を入れますか?~/.pam_environment
~/.pam_environment
このファイルは、使用されているすべてのログイン方法で読み取られます。ポリアクリルアミドファイルがアクティブになります。これには、今日のほとんどのLinuxシステムが含まれます。
主な利点~/.pam_environment
は、(アクティブな場合)ユーザーシェルが起動する前に読み取られるため、セッションタイプ、ログインシェル、およびその他の複雑さに関係なく機能することです。su -c somecommand
などの非対話型ログインにも機能しますssh somecommand
。
主な制限~/.pam_environment
は、複雑なシェル構文ではなく単純な割り当てのみを入れることができることです。このファイルの構文は次のとおりです。
- ファイルは1行ずつ解析されます。
VAR=VALUE
各行は、文字、数字、および下線で構成されるVAR形式でなければなりません。別の形式では、VAR DEFAULT=value
構文と特殊変数を使用して環境変数を拡張できます。${VAR}
@{HOME}
@{SHELL}
#
コメントを開始すると、値には表示されません。- VALUEが含まれている場合、
"
VARは引用符の間の文字列に設定されます。 \$
または、\@
テキストを挿入する$
か@
、エスケープされた改行文字を使用して長い行を分割することもできます\
。- 空白がない場合や引用符がない空白などの構文エラーがある場合、
=
変数は環境から削除されます。
したがって、利点は、~/.pam_environment
さまざまな状況で動作することです。欠点は、コマンドの出力を使用できない(たとえば、ディレクトリやプログラムが存在するかどうかをテストするために)、一部の文字(#"
、改行)を値に入れることができない、または入れることが難しいことです。
何を入れますか?~/.profile
ファイルにはポータブル(POSIX)sh構文が必要です。[[ … ]]
システムは、これらのシェルを/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がインタラクティブであっても、ログインシェルの内容を読みません。これらの問題をもう一度覚えたくない場合は、次の2行を使用して1つを作成してください。~/.bash_profile
~/.profile
~/.bashrc
~/.bash_profile
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
また、見ることができますBashを使用して環境変数を設定するには、どの設定ファイルを使用する必要がありますか?
ログインシェルがzshの場合
~/.zprofile
Zshはとを読みます~/.zlogin
が、そうではありません~/.profile
。 zshの構文はshとは異なりますが、~/.profile
shエミュレーションモードで読み取ることができます。次の目的で使用できます~/.zprofile
。
emulate sh -c '. ~/.profile'
また、見ることができますZsh は ~/.profile をクリックしません。
ログインシェルが別のシェルの場合
/bin/sh
ログインシェルとして使用し、お気に入りのシェル(Fishなど)をインタラクティブシェルとして使用する以外にできることはあまりありません。これが私がzshにすることです。他のシェルを呼び出す上記の例を参照してください~/.profile
。
リモートコマンド
対話型シェルなしでリモートコマンドを呼び出すと、すべてのシェルが起動ファイルを読み取るわけではありません。
ENV
変数を渡すと、Ksh は変数で指定されたファイルを読み込みます。
Bashは~/.bashrc
次のような場合に読みます。対話型ではない(!)とその親プロセスをまたはrshd
と呼びますsshd
。だからあなたは~/.bashrc
あなたの仕事を始めることができます
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
~/.zshenv
Zshは起動時に常に読み取ります。他の変数を設定するサブシェルの場合でもzshのすべてのインスタンスがそれを読み取るので注意して使用してください。 zshがログインシェルであり、リモートコマンドの変数を設定するためにのみ使用するには、ガードを使用します。~/.profile
たとえば、でいくつかの変数を設定し、MY_ENVIRONMENT_HAS_BEEN_SET=yes
読み取る前にこのガードを確認してください~/.profile
。
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
グラフィックログインケース
多くのディストリビューション、ディスプレイマネージャ、およびデスクトップ環境では、起動~/.profile
スクリプトから明示的にインポートするか、ログインシェルを実行して実行するようにスケジュールしています。
~/.profile
残念ながら、未読のディストロ/DM/DEの組み合わせを処理する普遍的な方法はありません。
で開始された既存のセッションを使用している場合は、ここでソーシング(たとえば)を介して~/.xsession
環境変数を設定する必要があります。一部の設定では、デスクトップ環境起動スクリプトがソースを再インポートします。~/.profile
. ~/.profile
~/.profile