各bash構成ファイル(~/.bashrc
、~/.bash_profile
、~/.profile
)の前にecho NAME_OF_FILE
を追加しました。つまり、~/.bashrc
でソースを取得すると「.bashrc」を取得します。
私を困惑させているのは、sshでコマンドを実行すると、〜/ .bashrcが含まれることを示す理由です。例:私がそうする場合:
ssh localhost echo hi
私は得る
.bashrc
hi
このコンテキストで~/.bashrc
を取得するのはなぜですか?これは非対話型のbashセッションを実行する必要があるため、ソースを取得するべきではありませんか?
確かに、ssh localhost tty
は私に「ttyではなく」を取得します(「.bashrc」の前に、~/.bashrc
がそれにもかかわらずソースされることを示します)。
~/.bashrc
でソースするコマンドのすべての構成ファイルを明示的にgrep
pedしましたが、それを説明するものはありません。
(tty -s && shopt -q login_Shell && [[ -r ~/.bashrc ]] && . ~/.bashrc
には.bash_profile
しかないので、インタラクティブなログインシェルでも「.bashrc」を取得できますが、これはsshの問題を説明していません。コメントアウトできますが、上記のsshの例でも同じ動作が得られます)
どうすればこれをデバッグできますか?
bash
のマニュアルページから:
Bash attempts to determine when it is being run with its standard input
connected to a a network con‐nection, as if by the remote Shell daemon,
usually rshd, or the secure Shell daemon sshd. If bash
determines it is being run in this fashion, it reads and executes commands
from ~/.bashrc, if that file exists and is readable.
つまり~/.bashrc
は、ttyを持っているかどうかに関係なく、ssh
を介して呼び出すと実行されます。
インタラクティブなときに.bashrc
のみを実行したい場合は、上部でこれを試してください。
# If not running interactively, don't do anything
[[ "$-" != *i* ]] && return
それがうまくいかない場合は、これを試してください:
[ -z "$PS1" ] && return