リモートBashソースが.bashrcの代わりに.bash_profileであるのはなぜですか?

リモートBashソースが.bashrcの代わりに.bash_profileであるのはなぜですか?

バッシュマニュアル説明する:

rshdBashは、リモートシェルデーモン(通常はシェルデーモン)やセキュアシェルデーモンによって実行されている場合など、ネットワーク接続に接続されている標準入力を使用して実行されていることを確認しようとしますsshd。 Bashがこのように実行中であると判断した場合、~/.bashrcファイルが存在し、読み取ることができる場合は、コマンドを読み取り実行します。

このBashソースは次~/.bashrcのとおりです。

ssh user@host :

しかし、このBashソースは次のとおりです~/.bash_profile

ssh user@host

仕様によると、これら2つのコマンドの間には違いはありません。どちらの場合も、標準入力がネットワーク接続に接続されていませんか?

答え1

ログインシェルは最初に読み、/etc/profile次に読みます~/.bash_profile

非ログインシェルを読ん/etc/bash.bashrcでから~/.bashrc

これはなぜ重要ですか?

次の行のためman ssh

もし注文する指定すると、ログインシェルではなくリモートホストで実行されます。

つまり、sshコマンドにコマンド以外のオプションしかない場合は、次のようになります。

ssh user@host

ログインシェルが起動し、ログインシェルが読み込みます~/.bash_profile

SSHコマンドでは注文する、よい:

ssh user@host :

命令が行くところ:(または何もしないところ)。
そうだろういいえ~/.bashrcコンテンツを読むためにログインシェルを起動します。


リモート標準入力

リモート・システムの /dev/stdin に提供される tty 接続は、実際の tty または別のものにすることができます。

のための:

$ ssh isaac@localhost
/etc/profile sourced

$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

$ ls -la /proc/self/fd/0
lrwx------ 1 isaac isaac 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3

$ ls -la /dev/pts/3
crw--w---- 1 isaac tty 136, 3 Dec 24 19:35 /dev/pts/3

開始されたbashに見られるように、TTY(ネットワーク接続ではない)で終わります。

コマンドを使用したSSH接続の場合:

$ ssh isaac@localhost 'ls -la /dev/stdin'
isaac@localhost's password: 
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

TTY リストは同じように始まりますが、/etc/profile はソースではありません。

$ ssh isaac@localhost 'ls -la /proc/self/fd/0'
isaac@localhost's password:
lr-x------ 1 isaac isaac 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]

これは、接続がパイプ(ネットワーク接続ではない)であることをシェルに通知します。

したがって、両方のテストケースでは、シェルは接続がネットワークから来ているかどうかを知らないため、読みません~/.bashrc(ネットワーク接続についてのみ話している場合)。 ~/.bashrcを読みますが、他に理由があります。

答え2

「どうして」ではなく「なぜ」と聞かれたので、そんな観点から答えてみましょう。過去に起こったことが今日起こっていることにつながった理由の詳細な説明は次のとおりです。


2つの異なる起動ファイル(「profile」と「rc」)があるのは、過去にコンピュータで作業が行われていた一般的な方法が次のとおりでした。

  1. 実際の端末や他のワークステーションからログインしてログインシェル。シェルはユーザーのための環境を呼び出して/etc/profile設定します。~/.profile

  2. ユーザーが入力したい環境を呼び出します。環境はXorgかもしれませんが、ほとんどの場合、GNU画面などのマルチプレクサです。

  3. その後、環境(GNU画面など)は、親ログインシェルから環境を継承する追加(非ログイン)シェルを呼び出します。

cshこれは開発中にUNIXシステムにログインする一般的な方法ですbash。だから~/.profileもう一度読むことは無駄とみなされますとにかく環境を継承するシェルから。

bash次に、~/.bashrcこれらの非ログインシェルの追加設定を追加します。 csh(およびtcsh)非ログインシェルにはいかなる種類の "rc"ファイルも追加しないでください。csh/はtcshBourneシェル(POSIXの一部)と互換性のあるシェルではありませんが、Bourneシェルと互換性がありますbash。別のBourne互換シェルは、定義されている場合に非ログイン実行コマンド(「rc」)ファイルとして使用されるksh環境変数(と呼ばれる)を追加します。ENVksh

はい。 Bourneシェルの最新バージョンでは、GNU画面(または同様の画面)と混在するシェルに表示されますが、ユーザーの画面には表示されないエイリアスやその他のクイックオプションの使用を容易にするために、追加の設定ファイルが追加されています。初めて入る時に受けます。マシン。

GDM(グラフィックディスプレイマネージャ)が登場し、GDMには独自の初期化ファイル(例えば、および~/.xinit~/.xsessionがあるため、「プロファイル」ファイルと「rc」ファイルの間の区別は意味がなくなりました。その後、GDM内で宣言されたシェルは、ユーザーの希望に応じてログインシェルまたは非ログインシェルになり、非ログインシェルが常にログインシェルの親を持つ状況は無効になります。

追加

私のものの一つお気に入りのテーブルシェルの起動ファイルを比較すると、Bourne シェル互換シェルはこれらのファイルをprofile使用しますが、他のシェルでは使用しない方法がわかります。過去には、初期シェル(食べ始めたシェル)がBourne互換シェルでなければならなかったからです。

関連情報