CentOSで$ PATHにディレクトリを追加しますか?


84

新しいサーバーを立ち上げ、CentOSをすべて実行しています。Ruby Enterprise Editionを正常にインストールした後、REE / bin(にある/usr/lib/ruby-enterprise/bin)ディレクトリを追加して、サーバー上のデフォルトのRubyインタープリターにします。

私は次のことを試しましたが、それは現在のシェルセッションに追加するだけです:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

すべてのユーザーに対してこのディレクトリを$ PATH に永続的に追加する正しいアプローチは何でしょうか。現在、ルートとしてログインしています。

前もって感謝します!

回答:


116

/etc/profileCentOSがこのファイルの更新を公開するたびにすべての変更が失われるため、このようなものを編集することはお勧めできません。これはまさに次の/etc/profile.d目的です。

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

再度ログインして、(安全に)更新されたPATHをお楽しみください:

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

再度ログインする代わりに、プロファイルをリロードできます。

# . /etc/profile

これにより、$PATH変数が更新されます。


1
~/.profileも別の有効なオプションです
ザイファー

4
はい、単一ユーザー向け。しかし、質問はすべてのユーザーのPATHを変更することでした。
マイク

2
@Mikeこのpathmungeコマンドとは何ですか?
ニコライ・レショフ14

@NickolaiLeschov $ PATHにパスを追加するだけだと確信しています。
マイク

@NickolaiLeschovそれは/ etc / profileで定義されている関数です
-CrazyPheel

11

fmonkのアドバイスに従った後/etc/bashrc、私はチェックアウトしましたが、「環境関連のものは/ etc / profileにある」ということに気付きました。私は調べて/etc/profile、これを見ました:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

私の問題を解決するためpathmunge /usr/lib/ruby-enterprise/binに、ifステートメントの下に追加しました。これで問題が解決しました。


誰か"$EUID" = "0"がこの文脈での意味を説明できますか?
エリ

EUID 0は、ユーザーがルートであることを意味します。
bbaja42

6
/etc/profile.dを使用する必要があります。以下の私の答えをご覧ください。
マイク

@MikeConigliaroの回答を正しいものとして受け入れることを検討してください。彼のやり方は正しいものです。そのように動作するように開発されています。/etc/profile.d/フォルダ内のファイルを見ると、それに気付くでしょう。また、彼が言ったように、システムの更新はソリューションを取り消す可能性があります。
カイオクーニャ

4

「/ bin / loginを使用して、/ etc / passwdファイルを読み取ることにより、ログイン成功後に対話型ログインシェルが開始されます。このシェル呼び出しは、通常、起動時に/ etc / profileおよびプライベートの同等の〜/ .bash_profileを読み取ります。

対話型の非ログインシェルは通常、シェルプログラム([プロンプト] $ / bin / bashなど)を使用してコマンドラインで、または/ bin / suコマンドによって起動されます。対話型の非ログインシェルは、グラフィカル環境内からxtermやkonsoleなどのターミナルプログラムでも起動されます。このタイプのシェル呼び出しは通常、親環境をコピーしてから、追加のスタートアップ構成手順についてユーザーの〜/ .bashrcファイルを読み取ります。 " http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

したがって、bashrcには環境変数を入れません。これは一般的な慣習に反するだけでなく、グラフィカルデスクトップ環境から端末を呼び出すときにbashrcの変数も見逃してしまうからです。

Redhatで/etc/profileこのコメントを見つけました。

「システム全体のエイリアスと関数は/ etc / bashrcに配置する必要があります。個人の環境変数と起動プログラムは〜/ .bash_profileに配置する必要があります。個人のエイリアスと関数は〜/ .bashrcに配置する必要があります。」

したがって、ユーザーごとに環境変数を設定する場合は、ユーザーの.bash_profileファイルで設定します。

.bash_profile私が読んだに向かって:

「個人環境変数と起動プログラム。

個人のエイリアスと関数は〜/ .bashrcに入れてください。システム全体の環境変数と起動プログラムは/ etc / profileにあります。システム全体のエイリアスと関数は/ etc / bashrcにあります。」

結論
たとえば、/ sbinに存在するプログラムをrootだけに見せたい場合は、そのパスをルートの.bash_profileファイルに追加します。しかし、あなたは、すべてのユーザーが自分のボックスにインストールされている特定のどのようなルート番組を見たい場合、私は入れてしまうでしょう/sbinにに/etc/.profile。すべてのユーザーは、タブ補完を使用してルート固有のプログラムを検索し、必要に応じて権限を昇格できるようになりました。

特殊なケース:SSH
コマンドラインでsshを起動すると、対話型ログインシェルが起動します。しかし、この場合/etc/profileは読まれません。.bash_profile各ユーザーのファイルで環境変数を定義すると、sshで動作しました。


2

申し訳ありませんが、次の質問は、ユーザーのプロファイルがユーザーを支援する場合に備えて残しておく質問です。

.bash_profileを変更します

nano ~/.bash_profile

次に、ファイルのどこかでパスを追加/変更します:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

その後、プロファイルをリロードします

source ~/.bash_profile

またはログアウトして再度ログインする

PATHを確認すると、新しく追加されたパスが含まれているはずです

echo $PATH

1

.rcファイルで環境変数を設定できます。bashシェルの場合(CentOSで最も一般的で、デフォルトだと思います)、各ユーザーは自分のホームディレクトリに.bashrcというファイルを持っています。

コマンドPATH = / usr / lib / ruby​​-enterprise / bin:$ PATHをこのファイルに追加して、特定のユーザーに設定します。

(言及したように)すべてのユーザーに設定するには、/ etc / bashrcで変更します(各ユーザーのホームディレクトリのデフォルトの.bashrcはこのファイルをソースする必要がありますが、再確認する必要があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.