.bash_profile .bashrc scp いやーん
.bash_profile .bashrc scp いやーん
2025-03-30
話がややこしくなるため、~/.bash_profile
, ~/.bashrc
のみ記載する。 /etc/profile
, ~/.bash_login
, ~/.profile
など他のファイルの記述はスキップする。
changes:
- 2025-03-31: わかりやすくするため、順番・見出しかえた。内容同じ
(1).背景・何がおきたか
- scp したら
stty: 'standard input': Inappropriate ioctl for device
がおきた。何これ?
.bashrc
が問題だった。
.bashrc
, .bash_profile
結局どうすれば?
(2).環境
- Linux Ubuntu 24.04.1
- bash 5.2.21(1)-release
testでは
chsh -s /bin/bash
にしておいた
(3).結論
*今回(scp)の場合
-
.bashrc
の頭ではじいた
# .bashrcの最初に記載してはじく
# scp, ssh command の時などスキップする
if [[ ! "$-" =~ "i" ]]; then return; fi
- なお、
scp
は$TERM
に注意せよ
(4).原因
-
.bashrc
でstty
コマンドを実行していた。 -
scp
,ssh command
のとき、.bashrc
、.bash_profile
どれが動くかよく理解していなかった。
(5).experience1: scpはTERMをdumbにしやがります
はじめ、scp
なら $TERM
無いよねと考え、次のようにしていた。
if [[ -z $TERM ]]; then return; fi
# とか
if [[ "x$TERM" = "x" ]]; then return; fi
# とか
すりぬけました.......。
scpの時、TERM=dumb
が行われていました。えええ〜〜〜!!!!
(6).experience2: bashファイル、結局、どのように動く
<loginか?>→yes→ .bash_profile
↓
no
↓
.bashrc
あれ?シンプル。
しかし頭がこんがらがるのはなぜだらふ?
それは各コマンドの動き。interactive
non-interactive
を意外に重くみていたこと。
(7).test result: bashファイル動き
~/.bash_profile
loginとみなされるもの -
端末で
login:
login: username Password: ***********
-
X session
+---------------------+ | username: [*******] | | password: [*******] | +---------------------+
-
command
root# login username Password: *********** local$
$ telnet remotehost login: username Password: *********** remote$
$ ssh username@remotehost remote$
$ bash -l local$
$ su -l username Password: *********** local$
$ su -l username -c command Password: ***********
$ sudo -l username command Password: ***********
~/.bashrc
他の場合 -
X11 (Xorg)
デスクトップが表示されている状態で起動する、あらゆるもの。xterm , ファイルマネージャーなどなど -
command
$ ssh user@remotehost command
$ scp filename user@remotehost:filename
$ bash local$
$ su username Password: *********** local$
$ su username -c command Password: ***********
$ sudo username command Password: ***********
(8).discus: 頭の整理として
-
bash
,su
などの動きをみると、interactive
云々にこだわるから解らなくなるのでは?と感じた。-
non-interactive
でも、su -l user command
で.bash_profile
- 確かに内部では
-l
でlogin
扱いだが、使用者目線では、「su
叩いているだけなのに!?」となる。
-
- man bash に
interactive
non-interactive
の語が出るため惑う。 - X11 (Xorg) は、X session で入った(あるいは 端末login 後 xinit, startx するなら、端末loginして入った) 時が login 扱い。その後は非login。呼び出したアプリは X session (xinit) の上で呼び出されている。よって
.bashrc
(9).補:ファイルよみこみについて
debianもubuntuも、デフォルトでは、どちらかのファイルが、どちらかを呼ぶようになっていると思う。
. "$HOME/.bashrc"
# とか
. "$HOME/.bash_profile"
# とか
ディストリビューションそれぞれで書き方の差異はあるものの、多かれ少なかれ、ファイルをよみこんでいるのではなかろうか。
意見がさまざま、どれも理解できる。見聞きする意見:
-
.bash_profile
に env 、.bashrc
に alias などにわけている。 -
.bash_profile
に全部書いている。 - env で
PATH="${PATH}:/usr/local/bin"
としていた場合、source
してしまうと、パスがドンドンふえる。.bashrc
内でsource .bash_profile
すると、xterm 上げるとPATH
がふえる。 -
ssh
コマンドで操作しようとしたら、PATH
が通っていない。不便。.bashrc
に env 書くことになった。
このような事があるため、「えーい、面倒だ」として source
するきもちもわかる。
それぞれやりやすいように、としか言えないかぁ...。
增殖する PATH
や、scp
rsync
で端末表示が走ってコケた、などに注意すれば良いのではないか。
(10).感想
ややこしい。
ややこしすぎる。
と思ったが、もっとシンプルに考えれば良いのかも?
Discussion