~/.bashrc に alias を書いた
端末を開いたら効くのに、SSH でログインしたときは効かへん。何で?
【疑問】~/.bashrc に書いた設定が SSH でログインしたときだけ効かへん。/etc/profile・~/.bash_profile・~/.bashrc の読まれる順番【LPICレベル1】
前提のおさらい。シェル変数はそのシェルの中だけ、export した環境変数は子プロセスにも渡る。ログアウトしたら消えるから、毎回の設定はファイルに書いておく
>>1
シェルの起動のしかたで、読むファイルが違う。bash の man の INVOCATION の節に書いてある
>>3
ログインシェル(SSH やコンソールでログインしたとき、bash -l)
1. /etc/profile
2. ~/.bash_profile、~/.bash_login、~/.profile のうち、最初に見つかった1つだけ
終わるときに ~/.bash_logout
>>3
ログインしない対話シェル(ログイン後に端末を開いたとき、bash と打ったとき)
~/.bashrc(Debian の bash は先に /etc/bash.bashrc も)
>>4
中身が「自分の名前を echo するだけ」のファイルを置いた HOME で試したbash -l -c 'echo body' → [bash_profile] body
~/.bash_profile を消して同じことをする → [profile] bodybash -i -c 'echo body' → [bashrc] bodybash -c 'echo body'(スクリプトと同じ、対話でもログインでもない)→ body だけ
ログインシェルで exit → [logout]
>>6
じゃあログインシェルでは ~/.bashrc は読まれへんのか
>>7
bash そのものは読まない。だから ~/.bash_profile か ~/.profile の中で ~/.bashrc を読み込ませるのが定番。Debian の /etc/skel/.profile にも「~/.bashrc があれば読む」行が入ってる
>>8
SSH で効かんかったのは、自分で ~/.bash_profile を作ったせいやな。あると ~/.profile が読まれへんから、~/.bashrc も読まれへんかった
>>8
読み込む行は [ -f ~/.bashrc ] && . ~/.bashrc みたいな形。. は何?
>>10. と source は同じで、ファイルを今のシェルの中で実行する。bash ファイル だと子のシェルで動くから、変数は戻ってこない
中身が X=1 のファイルで試した。bash で実行したあと X は空、. で読んだあと X は 1
>>11
~/.bashrc を書き換えたあと、ログインし直さずに source ~/.bashrc で今のシェルに反映できるのもこれやな
>>4
/etc/profile は全員分?
>>13
そう。/etc の下はシステム全体、~ の下はそのユーザーだけ。Debian の /etc/profile は PATH を決めて、/etc/profile.d/ の下の .sh を順に読む。全員に足したい設定は /etc/profile を直接直さずに /etc/profile.d/ にファイルを置くほうが、更新で消されにくい
>>3
ログインシェルかどうかは、どう確かめるん?
>>15shopt login_shell が on ならログインシェル。echo "$0" が -bash みたいに - で始まってもログインシェル。対話かどうかは $- に i が入ってるか
>>15
sh の名前で起動したときは?
>>17
古い sh に合わせて、ログインシェルなら /etc/profile と ~/.profile だけを読む。~/.bash_profile は読まない
>>9
ログインは profile 系、端末は bashrc。profile から bashrc を読ませて、書き換えたら source、で覚えた
管理人のひとこと
- ログインシェル(SSH・コンソール・
bash -l)は /etc/profile を読み、次に ~/.bash_profile・~/.bash_login・~/.profile のうち最初に見つかった1つだけを読む。終了時に ~/.bash_logout。 - ログインしない対話シェルは ~/.bashrc(Debian では /etc/bash.bashrc も)。ログインシェルは ~/.bashrc を自動では読まないので、~/.bash_profile や ~/.profile から読み込ませる。
source ファイルと. ファイルは今のシェルで実行するので、変数や alias が残る。bash ファイルは子のシェルで動く。- /etc の下は全員、~ の下は本人だけ。全員向けの追加は /etc/profile.d/ に置く方法もある。ログインシェルかどうかは
shopt login_shellで確かめられる。