web-dev-qa-db-ja.com

毎回.bash_profileを自分で調達せずに環境を設定するにはどうすればよいですか?

Ubuntu 14.04を再起動すると、環境変数がデフォルトに戻り、毎回source .bash_profileを実行する必要があり、非常に面倒です。私は通常、.bash_profileにあるホームディレクトリの/home/buraktasに環境変数を保持します。このファイルのテキスト:

### export Java_HOME variable
export Java_HOME=/usr/local/dev/jdk1.8.0_20
export PATH=$PATH:$Java_HOME/bin

### export M2_HOME
export M2_HOME=/usr/local/dev/maven
export PATH=$PATH:$M2_HOME/bin

### export SCALA_HOME
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$SCALA_HOME/bin

あらゆる種類の対応に感謝します。

5
quartaela

TL; DR:代わりにexportコマンドを.profileに入れ、.bash_profileを削除または名前変更し、ログアウトして再びログインする変更を適用します。

ユーザーごとの「プロファイル」ファイルの使用方法

ほとんどのデスクトップ環境は、デフォルトで構成されているため、グラフィカルにログインすると、ホームディレクトリの.profileファイルが取得されます。 Ubuntuのデフォルトのデスクトップ環境を使用しているようです。これはUnityを使用したGNOMEです。うまくいくはずです。

ほとんどの Bourneスタイルのシェル は、 login Shell として呼び出されたときに.profileもソースします。 これにはbashが含まれますが、.profile.bash_profileが存在しない場合にのみ.bash_loginが供給されます。 .bash_profileが存在する場合、それが使用されます。それ以外の場合、.bash_loginが存在する場合は、それが使用されます。それ以外の場合は、.profileが使用されます。

これは、bashであるシェルに依存しないコマンド(ログイン時に実行するコマンド)が.profileに移動でき、bash固有のコマンドがある場合は、それらのコマンドのいずれかに配置できるようにするためです。 2つのファイル。通常、.profileまたは.bash_profile内から.bash_loginをソースします。

.bash_profileの唯一のコマンドが質問で示したものである場合、これらのコマンドはBourneスタイルのシェル間で移植可能であるため、.bash_profileを使用する必要はまったくありません。その後、.bash_profileを削除(または.bash_profile.oldなどの名前に変更)し、それらのコマンドを.profileに配置できます。彼らはそのファイルの一番下に行くことができ、必要に応じて最初にバックアップすることができます(バックアップの合理的な名前は.profile.oldまたは.profile.origかもしれませんが、実際には使用されていないのであなたが望むものに名前を付けることができます)。

.bash_profileが存在しない場合(.bash_loginが提供されない場合)、.profileが使用されます。 (.profileはおそらくグラフィカルログインにすでに使用されています。)

何をすべきか

.bash_profileを削除または名前変更します。

.profileを編集します。通常は次のようになります。

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

コードの11行すべて(空白行とコメントをカウントしない場合は6行)を.profileの最後に追加し、ファイルを保存して、ログアウトして再度ログインするだけです。

オプション:これらの割り当ての書き換えを検討する場合があります

これは完全にオプションですが、この機会を利用して リファクタリングexportステートメントを作成することをお勧めします。現在使用しているもの:

### export Java_HOME variable
export Java_HOME=/usr/local/dev/jdk1.8.0_20
export PATH=$PATH:$Java_HOME/bin

### export M2_HOME
export M2_HOME=/usr/local/dev/maven
export PATH=$PATH:$M2_HOME/bin

### export SCALA_HOME
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$SCALA_HOME/bin

PATHが3回変更され、割り当てられている他の変数ごとに1回変更されます。これは大丈夫で、あなたが望むものかもしれません。しかし、この選択肢よりも長く、(私の意見では)自己文書化が少なくなります。

# export Java, Maven, and Scala homes and add their bins to PATH
export Java_HOME=/usr/local/dev/jdk1.8.0_20
export M2_HOME=/usr/local/dev/maven
export SCALA_HOME=/usr/local/dev/scala-2.11.2
export PATH=$PATH:$Java_HOME/bin:$M2_HOME/bin:$SCALA_HOME/bin

.bash_profileが必要な場合(ただし、おそらく必要ありません)

私がお勧めしたことは、 c0rp が以前に言ったことに非常に似ていることに注意する必要があります( コメント on 投稿 は削除されました):

すべての変数を~/.profileに配置し、~/.profileから~/.bash_profileをソースします。 ~/.profile起動プロセスのデスクトップセッション中にDisplayManagerによって自動的に実行され、テキストコンソールからログインするときにlogin Shellによって実行されます

しかし、私の推奨事項は1つの重要な点で異なります。.bash_profileファイルはまったく必要ないと思われるため、邪魔にならないように移動(削除または名前変更)することをお勧めします。 .profileで。

何らかの理由で.bash_profileファイルが必要な場合、環境変数の定義を避ける必要があります(グラフィカルログインではなく、bashログインにのみ適用されるため) 。

.bash_profileファイルに入れる必要があるbash固有のコマンドがある場合、c0rpが言ったように、この行を.bash_profileファイルに入れることができます。

. $HOME/.profile

その後、.bash_profile.profileをソースとし、.profileのコマンドはbashログインと非bashログインの両方で実行されます。

.profileを使用しても機能しない場合

その後、さらにトラブルシューティングが必要になりますが、次のことに注意する価値があります。

LightDMは.profileをソースとしていないと人々が言うのを聞いたことがあります。 これは少なくとも一部のOSにパッケージ化されているので真実だと思います 。絶対に話をすることはできませんが、LightManagerをディスプレイマネージャーとして使用したUbuntuシステムでは、.profileがグラフィカルセッションでになり、.profileの変数エクスポートが有効になりました。

(Debianのような他のOSで私のためにいつも働いているわけではありません。)

.profileを使用しても機能しない場合:簡単で汚れた代替手段

変数定義に冗長性を持たせる場合は、.pam_environmentを簡単な代替手段として使用できます。

man pam_env は、envfileでKEY=VALペアとして環境変数を定義できることを説明します。そのマンページで説明されているように、デフォルトのシステム全体のenvfileは/etc/environmentであり、デフォルトのユーザーごとのenvfileは~/.pam_environmentです。

したがって、ホームディレクトリに.pam_environmentファイルを作成し、その中に次のようなものを入れることができます。

Java_HOME="/usr/local/dev/jdk1.8.0_20"
M2_HOME="/usr/local/dev/maven"
SCALA_HOME="/usr/local/dev/scala-2.11.2"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/dev/jdk1.8.0_20/bin:/usr/local/dev/maven/bin:/usr/local/dev/scala-2.11.2/bin"

ご覧のとおり、何かを変更するには複数の変更を行う必要があり、この高レベルの複製は読みにくく、理解するのも難しくなります。そのため、最初にこの方法を推奨しませんでした。

状況で最も簡単で自己文書化の方法は、上記のように.profileで環境変数を定義してエクスポートすることです。

EnvironmentVariables 記事 は可能であると主張している 環境変数の値を変更し、さらに.pam_environmentのような構文で、PATH DEFAULT=${PATH}:${HOME}/MyProgramsに他の環境変数の拡張を含めることもできます。しかし、これは (より)公式ドキュメントと完全に矛盾しているようです 、複数のマシンで成功せずに試しましたが、他のマシンでも失敗したと聞いたことがあります。 wiki作成者がpam_env "envfile"構文を pam_env "conffile"構文と混同していることを強く疑っていますman pam_env で使用されている用語を使用します)。うまくいけば、誰かが確実に見つけて、Wikiを(修正または明確化のために)編集できるようになることを願っています。

OS Xで.bash_profileが機能する理由

OS Xは、デフォルトのグラフィカルデスクトップ(つまり、Terminal.appインスタンス)のターミナルのデフォルト構成が、非ログインシェルではなくログインシェルとしてシェルを起動する数少ない環境/システムの1つです。 ( Cygwin は別です。)

Terminal.appによって直接起動されたOS X上の各bashインスタンス(設定を変更していない限り)はログインシェルとして機能するため、.bash_profileが取得されます。

Terminal.app(またはSSHセッションなどの非グラフィカルログイン)からアクセスされる環境以外では、.bash_profileでのエクスポートも適用されないと思われます。

.bash_profileに関しては、OS XとUbuntuの主な違いは次のとおりです。

  • OS Xでは、Terminal.appによって起動されたシェルはログインシェルとして起動されます。 bashはOS Xのデフォルトの対話型シェル(OS X 10.3以降)であるため、.bash_profileが存在する場合はソースとなります。

  • Ubuntuでは、グラフィカルセッション内からGNOMEターミナル(または別のGUIターミナルエミュレータ)を実行すると、シェルは通常ログインシェルではなく起動します。ログインシェルによって実行されるタスクは、通常、グラフィカルセッションをセットアップするために(通常はディスプレイマネージャーによって)すでに実行されているため、それらを再度実行する必要はありません。

    また、ログインに似たものが何も実行されていないときにログインシェルを起動することも少し奇妙です。

3
Eliah Kagan