🌞

.bash_profile .bashrc scp いやーん

2025/03/30に公開

.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
# .bashrcの最初に記載してはじく
# scp, ssh command の時などスキップする
if [[ ! "$-" =~ "i" ]]; then return; fi
  • なお、scp$TERM に注意せよ

(4).原因

  • .bashrcstty コマンドを実行していた。
  • scp, ssh command のとき、.bashrc.bash_profileどれが動くかよく理解していなかった。

(5).experience1: scpはTERMをdumbにしやがります

はじめ、scpなら $TERM 無いよねと考え、次のようにしていた。

.bashrc
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: ***********
    

他の場合 ~/.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
    • 確かに内部では -llogin 扱いだが、使用者目線では、「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