.bash_profile .bashrc scp いやーん
.bash_profile .bashrc scp いやーん
2025-03-30
話がややこしくなるため、~/.bash_profile , ~/.bashrc のみ記載する。 /etc/profile , ~/.bash_login , ~/.profile など他のファイルの記述はスキップする。
changes:
- 2025-03-31: わかりやすくするため、順番・見出しかえた。内容同じ
- 2025-05-23: 語を補足で追加
(1).背景・何がおきたか
- scp したら
stty: 'standard input': Inappropriate ioctl for device
がおきた。何これ?
.bashrc が問題だった( stty コマンドを実行していた )。
.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ファイル動き
loginとみなされるもの ~/.bash_profile
-
端末で
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: ***********
他(login以外)の場合 ~/.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叩いているだけなのに!?」となる。 - 結局、loginか否かでみた方がわかりやすい。
-
- man bash に
interactivenon-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