質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

12512閲覧

/etc/environment の書き方

wkbiz

総合スコア152

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2021/10/12 07:59

よろしくお願いします。

初歩すぎて恥ずかしいのですが /etc/environmentの書き方を教えて頂けないでしょうか。
やりたいことは起動時にPATHを追加したい。この1点です。

(/etc/environment) PATH="/path/to/dir1" PATH="/path/to/dir2"

上記のように記述後、設定を読み込ませて
source /etc/environment

OS再起動
reboot

起動後確認すると良い。・・・この認識なのですが合っていますでしょうか?

(/etc/environment)の記述の方法で現在のPATHに追記する、という風に書いて再起動しました
PATH="$PATH:/path/to/dir1"

OSは起動しますが次のエラーでsudoなどコマンドを受け付けてくれなくなります。

-bash: ls: command not found /usr/libexec/grepconf.sh: line 5: grep: command not found -bash: uname: command not found -bash: ps: command not found

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/10/12 08:10

echo $PATH してみてください。
wkbiz

2021/10/12 08:15

コメントありがとうございます。sudoなどが使えない状態のもので echo $PATHをすると下記が表示されました。 すみませんこの先どうすれば良いのかが分かりません、お教えいただけないでしょうか。 [root@centos7 ~]# echo $PATH /opt/ruby3/rubies/ruby-3.0.2/bin/gem
guest

回答4

0

/etc/environmentは、/etc/profile~/.bashrcなどのようにシェルで実行されるファイルでは無いです。
$PATHで環境変数PATHの値を参照できるのは、シェルの機能なので、/etc/environmentには通用しません。

あくまで、環境変数を変数名=値で記述できるだけです。シェルでなくPAMという認証機能が読み込みます。

投稿2021/10/12 10:08

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/10/13 02:36

コメントありがとうございます。 otnさんが別の方の質問でPAMの話されていたのを知っていたのですが、$PATHは使えるものだと勘違いしていました。
guest

0

ベストアンサー

/etc/environment は下記のようにシステムパスを含めて書きますが、できるだけこのファイルを変更するのはやめたほうがいいです。OSの動作を知るために検証としてなら問題ありませんが、セキュリティーホールを作ることになりかねないです。

パスの書き方

異なるパスはスペースなしの : でつなぎます。(Windowsは ; です)

sh

1PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/path/to/dir1:/path/to/dir2"

ユーザー環境設定

Windowsをご使用でしたら、システム環境設定のウィンドウで上部がユーザー環境設定です。Linuxでは ~/.bash_profile~/profile にあたります。ユーザー固有の環境設定を書きます。

なお、ユーザー環境でシステムパスを拡張するには下記のように書きます。

sh

1export PATH="$PATH:/path/to/dir1:/path/to/dir2"

システム環境設定

そして、システム環境設定のウィンドウで下部がシステムパスです。Linuxではこれが /etc/environment にあたります。システム全体で使用する環境設定を書きます。

アプリケーション環境設定

通常、Linuxではメインプロセスから起動した環境変数はサブプロセスと共存可能です。

sh

1export SOME_ENV=... 2echo $SOME_ENV

sudoでエラーになる理由

まず、システムパスがとおっていないことになるので、ls をコマンドとして認識できなくなります。この状態でも /bin/ls とすれば認識はします。

また、sudo は初期設定では独自パスに切り替わります。 /etc/sudoersDefaults secure_path="sudo専用システムパス" が書かれています。


余談ですが、以前にRubyのバージョン管理を使用した起動アプリケーションについてご質問されていたと思います。 Python や Ruby のバージョン管理は少々特殊です。なぜなら、普通のグローバル変数とシステム環境変数も区別がないため、意図せずにプログラム起動中に環境が切り替わってしまうことを防ぐ設計になっています。

通常、本番環境ではバージョン管理を使わないでパッケージインストールすると思いますので、上記のようなことはあまり気にする必要はありません。(ものによってはコンパイルしますが、コンパイルするとメンテナンスが大変です)

投稿2021/10/12 08:27

編集2021/10/12 08:37
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/10/12 09:09 編集

コメントありがとうございます。はい、別の質問から引き続いています。 /etc/environmentの危険性は知っていますが .bashrcやexport PATH=・・・でPAHT追加しても反映されないためenvironmentを使うしかないのでは?と至った経緯です。 > 意図せずにプログラム起動中に環境が切り替わってしまうことを防ぐ設計 ご指摘の点は不勉強でした。この話は一般的にどの本にも書かれていることなのでしょうか? rvmを使っていますがrvmもrbenvも使わずに素で使うべき、と受け取りましたが、以前触れたように使いたいのは ruby3.0.2とgem3.2.22ですが、意図せず/bin/ruby(v2), /bin/gem(v2)を使いに行くため難儀しています。 掲題から離れてしまいますが何かお知恵があればご助言いただけると幸いです。よろしくお願いします。
Tomak

2021/10/12 09:30 編集

https://teratail.com/questions/361926 これですよね。わたしなら、rbenv をどうしても使う必要があるなら、プロジェクトディレクトリ直下にインストールします。 そして、`sudo ruby test.rb` の sudo を使わなくて済むようにします。読み込みディレクトリと書き出しディレクトリがプロジェクトディレクトリではない場合は、これらのディレクトリに起動ユーザーとグループの権限を割り当てます。(`chown 一般ユーザー:グループ /データファイルディレクトリ`) 例えば、CRONなどで root から起動するときは管理権限なので別の一般ユーザーでも、開発時の一般ユーザーに切り替え可能なはずです。そして、ruby のパスはBASHなどで起動ファイルを作成して、そこに `プロジェクトディレクトリ/.ruby-3.0.2/○○○○` をパスを書いてパス解決します。 ---- どうしても sudo を使いたい場合は、普通に ruby として起動したときに「/bin/ruby」なのでパスの優先順位がシステムパッケージ優先になっています。たぶん現状こんな感じになっている 「PATH="/opt/ruby3/rubies/ruby-3.0.2/bin:/bin:○○○○"」ので「PATH="/bin:○○○○:/opt/ruby3/rubies/ruby-3.0.2/bin"」と書き直します。他にも設定に必要がパスがあるはずなのですべて同様にパスの最後のほうに追記します。 そうすれば、「sudo -E which ruby」でご希望の ruby が読みだせます。スクリプトの中で切り替える必要があるときは、起動ファイルを作ってそこでパスを切り替えます。 ===== local _PATH=$PATH export PATH="/bin:○○○○:/opt/ruby3/rubies/ruby-3.0.2/bin:○○○○" sudo -E ruby test.rb export PATH=$_PATH ... =====
wkbiz

2021/10/12 09:42 編集

ご助言いただきありがとうございます。 早速試してみます。 (前回の別質問は、ご教示のURLのものです) ちなみにrbenvは使っておらず、rvmで進めるという話で進んでいます。 たぶんrbenvと同じくrvmもプロジェクト直下に置いて解決する方法が 解決策なのかなと感じましたが間違っているようでしたらご指摘いただけると幸いです。
Tomak

2021/10/12 09:59

すみません。そうですね rbenv は私の認識違いでした。適宜 rvm に置き換えていただけれるとたすかります。 今気づきましたが、バッチファイルを作るなら rvm で環境設定ファイルを作っておいて、その環境設定ファイルで切り替えたほうがすんなり行きますね。(rvm gemset create 3.0.2用プロジェクト名) ===== # RVM環境設定読み込み source 3.0.2用プロジェクト環境設定パス sudo -E ruby test.rb source システム環境設定ファイルパス ... =====
退会済みユーザー

退会済みユーザー

2021/10/20 20:43

横からすみません。 > セキュリティーホールを作ることになりかねないです。 上記はどのような懸念でしょうか?
Tomak

2021/10/20 22:30

>> セキュリティーホールを作ることになりかねないです。 > 上記はどのような懸念でしょうか? パスの優先順位とオーナーシップについて考察してみてはいかがでしょうか。 OSの環境パスにアプリケーションパスを通す危険性やその意味を知っていて、このように設定する必要性があれば特に問題はありません。
退会済みユーザー

退会済みユーザー

2021/10/20 23:13

/etc/environment を変更という行為で追加(?)されるディレクトリが適切な権限設定をされていないと危険だよ。という事でしょうか?
guest

0

正当なやり方ではないと思いますが・・・。

itagagaki さんが おっしゃっているように、

bash

1echo $PATH

してその内容を書き留めます。
わたしの環境の場合

plain

1/home/hogehoge/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl

でした。
最初のは、ユーザのホームの定義なのではしょって「/etc/environment」に

bash

1PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/path/to/dir1:/path/to/dir2

と記述します。
reboot 後、sudo も効きますし

bash

1$ echo $PATH 2/home/hogehoge/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/path/to/dir1:/path/to/dir2

となりました。

投稿2021/10/12 08:24

showkit

総合スコア1638

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/10/12 08:27

コメントありがとうございます。 つまり、PATH="$PATH:/a/to/b"のような書き方をせずに、「全て記述する」 と言うことで宜しいのでしょうか?
showkit

2021/10/12 08:31

実際、正当なやり方ではないので、どこでどのパスが設定されるかをある程度無視して、もともとあった パスを壊さないようにするには、「全て記述する」この書き方でよいかと思います。「/etc/environment」がどの段階で実行されているかによって「$PATH」が未設定のことが考えられますが、全部記述しておけば、なんとかなると思います。
wkbiz

2021/10/12 08:56

ありがとうございます。 その方向で試してみます。
guest

0

シェルのスタートアップ時の環境変数PATHの設定は質問に書いてある方法で間違っていないのですが
(あくまでもシェルのためだけの設定としては、ですが)
そのようにした結果が
/opt/ruby3/rubies/ruby-3.0.2/bin/gem
なら、どこかでPATHの設定に間違いがあるのでしょうね。
これだと、/opt/ruby3/rubies/ruby-3.0.2/bin/gem にあるコマンドしか実行できません(コマンド名では)。

まず、現在の状態で各基本コマンドを実行するには、
/usr/bin/ls
あるいは
/bin/ls
などのようにフルパスで指定すれば実行はできます。

で、シェルのスタートアップ時の実行ファイル(シェルがbashなら~/.bashrcなど)をよく見なおしてください。
上記のとおり基本は間違っていないので、実際にスタートアップファイルに書かれたコマンド行に何かしらの間違いがあるのだと思います。

投稿2021/10/12 08:22

編集2021/10/12 08:23
itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問