読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】~/.bashrc に書いた設定が SSH でログインしたときだけ効かへん。/etc/profile・~/.bash_profile・~/.bashrc の読まれる順番【LPICレベル1】

19レスカテゴリ:Linux
1: 名無しさん

~/.bashrc に alias を書いた
端末を開いたら効くのに、SSH でログインしたときは効かへん。何で?

2: 名無しさん

前提のおさらい。シェル変数はそのシェルの中だけ、export した環境変数は子プロセスにも渡る。ログアウトしたら消えるから、毎回の設定はファイルに書いておく

3: 名無しさん

>>1
シェルの起動のしかたで、読むファイルが違う。bash の man の INVOCATION の節に書いてある

4: 名無しさん

>>3
ログインシェル(SSH やコンソールでログインしたとき、bash -l)
1. /etc/profile
2. ~/.bash_profile、~/.bash_login、~/.profile のうち、最初に見つかった1つだけ
終わるときに ~/.bash_logout

5: 名無しさん

>>3
ログインしない対話シェル(ログイン後に端末を開いたとき、bash と打ったとき)
~/.bashrc(Debian の bash は先に /etc/bash.bashrc も)

6: 名無しさん

>>4
中身が「自分の名前を echo するだけ」のファイルを置いた HOME で試した
bash -l -c 'echo body' → [bash_profile] body
~/.bash_profile を消して同じことをする → [profile] body
bash -i -c 'echo body' → [bashrc] body
bash -c 'echo body'(スクリプトと同じ、対話でもログインでもない)→ body だけ
ログインシェルで exit → [logout]

7: 名無しさん

>>6
じゃあログインシェルでは ~/.bashrc は読まれへんのか

8: 名無しさん

>>7
bash そのものは読まない。だから ~/.bash_profile か ~/.profile の中で ~/.bashrc を読み込ませるのが定番。Debian の /etc/skel/.profile にも「~/.bashrc があれば読む」行が入ってる

9: 名無しさん

>>8
SSH で効かんかったのは、自分で ~/.bash_profile を作ったせいやな。あると ~/.profile が読まれへんから、~/.bashrc も読まれへんかった

10: 名無しさん

>>8
読み込む行は [ -f ~/.bashrc ] && . ~/.bashrc みたいな形。. は何?

11: 名無しさん

>>10
. と source は同じで、ファイルを今のシェルの中で実行する。bash ファイル だと子のシェルで動くから、変数は戻ってこない
中身が X=1 のファイルで試した。bash で実行したあと X は空、. で読んだあと X は 1

12: 名無しさん

>>11
~/.bashrc を書き換えたあと、ログインし直さずに source ~/.bashrc で今のシェルに反映できるのもこれやな

13: 名無しさん

>>4
/etc/profile は全員分?

14: 名無しさん

>>13
そう。/etc の下はシステム全体、~ の下はそのユーザーだけ。Debian の /etc/profile は PATH を決めて、/etc/profile.d/ の下の .sh を順に読む。全員に足したい設定は /etc/profile を直接直さずに /etc/profile.d/ にファイルを置くほうが、更新で消されにくい

15: 名無しさん

>>3
ログインシェルかどうかは、どう確かめるん?

16: 名無しさん

>>15
shopt login_shell が on ならログインシェル。echo "$0" が -bash みたいに - で始まってもログインシェル。対話かどうかは $- に i が入ってるか

17: 名無しさん

>>15
sh の名前で起動したときは?

18: 名無しさん

>>17
古い sh に合わせて、ログインシェルなら /etc/profile と ~/.profile だけを読む。~/.bash_profile は読まない

19: 名無しさん

>>9
ログインは profile 系、端末は bashrc。profile から bashrc を読ませて、書き換えたら source、で覚えた

管理人のひとこと