bashrc atau bash_profile?

49

Saya tahu perbedaan antara dua skrip login bash:

.bashrc dijalankan hanya oleh shell "non-login".

.bash_profile(atau .bash_loginatau .profile) dijalankan oleh shell "login".

Adakah yang punya beberapa contoh bagus tentang hal-hal apa yang lebih cocok untuk eksekusi dengan login saja, sehingga saya hanya memasukkannya .bash_profile, tetapi tidak benar-benar masuk akal .bashrc?

(Saya tahu sebagian besar dari kita sumber .bashrcdari .bash_profile, jadi sepertinya tidak ada banyak gunanya dalam pertanyaan sebaliknya ...)

Don Faulkner
sumber
3
Lihat juga pertanyaan yang sama di Super User .
Gilles 'SO- stop being evil'

Jawaban:

24

Karena a .bashrcadalah untuk shell non-login, saya menghindari perintah yang bergema ke layar. Saya juga mengalami pengalaman di mana pernyataan gema di .bashrcakan menyebabkan perintah sftp dan rsync gagal (dan mungkin perintah scp juga).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

Juga, Anda biasanya tidak akan menjalankan ssh-agent dari shell non-interaktif. Jadi saya punya ini .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Stefan Lasiewski
sumber
2
Jika Anda menggunakan ~ / .profile alih-alih ~ / .bash_profile hal-hal akan tetap berfungsi bahkan jika Anda mengganti shell .. ~ / .bash_profile untuk bash hal-hal tertentu.
LassePoulsen
1
Tetapi bash hanya akan menjalankan EITHER .bash_profile OR .profile, jadi jika Anda akan menggunakan keduanya, Anda perlu sumber .profile dari dalam .bash_profile atau sesuatu. Itu bukan ide yang buruk, sebenarnya ...
Don Faulkner
@Sumber & @Don: Poin bagus. Saya dulu punya Bashisms di .bash_profile saya, tapi sekarang saya sudah beralih ke sesuatu yang lebih universal. Mungkin menggunakan. Profil dalam rangka.
Stefan Lasiewski
Mengenai perintah penghasil keluaran yang .bashrcmengganggu metode transfer file jarak jauh yang diimplementasikan melalui stream standar , solusinya adalah dengan menempatkan perintah seperti itu di bawah kode yang memeriksa apakah shell bersifat interaktif dan berlanjut hanya jika itu. .bashrcFile default pengguna di Ubuntu, disalin dari /etc/skel/.bashrcpada pembuatan akun, serta seluruh sistem /etc/bash.bashrc, sudah berisi kode yang memeriksa dan kembali jika shell tidak interaktif (meskipun seseorang masih harus meletakkan perintah penghasil output seseorang di bawahnya ).
Eliah Kagan
8

Byobu adalah contoh yang bagus dari sesuatu yang tidak boleh Anda masukkan ke dalam .bashrc.

Kalau tidak, ia akan menjalankan dirinya secara rekursif di setiap terminal virtualnya ;-)

Anda dapat mencobanya, itu agak menyenangkan.

Itu sebabnya Anda memasukkannya .profile, jadi byobu (yang benar-benar hanya membungkus layar) hanya dimuat, satu kali, pada saat login. Dan byobu sendiri dapat memulai sesi bash interaktif baru.

Ralf
sumber
Itu contoh yang bagus. Terima kasih atas penunjuk ke Byobu juga. Sekarang untuk mencobanya.
Don Faulkner