Bash Manual mengatakan:
Bash mencoba menentukan kapan dijalankan dengan input standar yang terhubung ke koneksi jaringan, seperti ketika dijalankan oleh daemon shell jarak jauh, biasanya rshd, atau secure shell daemon sshd. Jika Bash menentukan sedang dijalankan dengan cara ini, ia membaca dan mengeksekusi perintah dari ~ / .bashrc, jika file itu ada dan dapat dibaca.
Sumber Bash ini ~/.bashrc
:
ssh user@host :
Tapi sumber Bash ini ~/.bash_profile
:
ssh user@host
Saya tidak melihat perbedaan dalam dua perintah ini sesuai dengan spesifikasi. Bukankah stdin terhubung ke koneksi jaringan dalam kedua kasus?
Jawaban:
Shell login pertama kali dibaca
/etc/profile
dan kemudian~/.bash_profile
.Shell non-login dibaca dari
/etc/bash.bashrc
dan kemudian~/.bashrc
.Mengapa itu penting?
Karena baris ini di
man ssh
:Dengan kata lain, jika perintah ssh hanya memiliki opsi (bukan perintah), seperti:
Itu akan memulai shell login, shell login membaca
~/.bash_profile
.Perintah ssh yang memang memiliki perintah , seperti:
Di mana perintahnya
:
(atau tidak melakukan apa-apa).Itu tidak akan memulai shell login, oleh karena
~/.bashrc
itu apa yang akan dibaca.Stdin jarak jauh
Koneksi tty yang disediakan untuk / dev / stdin di komputer jarak jauh mungkin tty yang sebenarnya atau yang lainnya.
Untuk:
Yang berakhir dengan TTY (bukan koneksi jaringan) sebagai bash mulai melihatnya.
Untuk koneksi ssh dengan perintah:
Daftar TTY memulai sama, tetapi perhatikan bahwa / etc / profile tidak bersumber.
Yang memberitahu shell bahwa koneksi adalah pipa (bukan koneksi jaringan).
Jadi, dalam kedua kasus pengujian, shell tidak dapat mengetahui bahwa koneksi berasal dari jaringan dan karena itu tidak membaca
~/.bashrc
(jika kita hanya berbicara tentang koneksi ke jaringan). Itu membaca ~ / .bashrc, tetapi untuk alasan yang berbeda.sumber
~/.bashrc
membaca?stdin
terhubung ke jaringan . Mengapa Anda menganggap itu? (Jawaban diedit, silakan baca).Anda bertanya tentang "mengapa" bukan "bagaimana", jadi saya akan mencoba menjawab dari perspektif itu. Berikut ini akan menjadi alasan mengapa banyak hal terjadi di masa lalu untuk menghasilkan bagaimana mereka terjadi hari ini.
Alasan memiliki dua file startup yang berbeda ("profil" dan "rc") adalah bahwa di masa lalu cara yang umum untuk bekerja pada mesin adalah:
Login dari beberapa terminal nyata atau workstation lain dan dapatkan shell login . Shell ini akan memanggil
/etc/profile
dan~/.profile
dan setup lingkungan bagi pengguna.Meminta lingkungan yang diinginkan pengguna untuk masuk. Lingkungan ini bisa menjadi Xorg, tetapi dalam banyak kasus itu adalah multiplexer seperti layar GNU.
Lingkungan (misalnya layar GNU) kemudian akan memanggil shell ekstra (non-login) yang mewarisi lingkungan dari shell login induk.
Itu adalah cara umum untuk masuk ke mesin UNIX selama waktu
csh
danbash
sedang dikembangkan. Karena itu dianggap sia-sia untuk membaca~/.profile
lagi di kerang yang mewarisi lingkungan.bash
kemudian ditambahkan~/.bashrc
untuk konfigurasi tambahan untuk shell non-login ini.csh
(dantcsh
) tidak pernah menambahkan file "rc" apa pun untuk cangkang non-login. Perhatikan bahwacsh
/tcsh
tidak shell kompatibel dengan shell bourne (yang merupakan bagian dari POSIX) sementarabash
itu. Shell kompatibel bourne lainnyaksh
,, menambahkan variabel lingkungan (disebutENV
), yang, jika didefinisikan akan digunakan sebagai file perintah run ("rc") untuk non-loginksh
.Jadi ya, versi yang lebih baru dari shell bourne menambahkan file konfigurasi tambahan sebagai kenyamanan untuk alias dan opsi cepat lainnya yang akan ada di dalam shell yang disandingkan dengan layar GNU (atau serupa) tetapi tidak ada dalam shell yang Anda dapatkan ketika Anda pertama kali memasuki mesin.
Dengan peningkatan manajer tampilan grafis (GDM), diferensiasi antara file "profil" dan file "rc" menjadi tidak berarti karena GDM akan memiliki file inisialisasi sendiri (misalnya
~/.xinit
dan~/.xsession
). Kemudian, shell yang dinyatakan dari dalam GDM dapat berupa shell login atau non-login tergantung dari keinginan pengguna, dan kasus di mana shell non-login akan selalu memiliki induk yang merupakan shell login tidak benar lagi.Tambahan
Salah satu tabel favorit saya tentang perbandingan file startup shell menunjukkan bagaimana shell kompatibel bourne shell menggunakan
profile
file sementara shell lain tidak. Ini karena di masa lalu shell awal (yang memulai muxer) perlu shell kompatibel bourne.sumber