Mengapa standar Ubuntu ~ / .profile source ~ / .bashrc?

30

Ini adalah isi dari stok ~/.profileyang datang dengan 13.10 saya (baris komentar dihapus):

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Ini diwarisi dari Debian tetapi mengapa Canonical memutuskan untuk menyimpannya? Sejauh yang saya tahu, itu bukan cara * nix standar dan saya telah melihat berbagai sistem di mana ini tidak terjadi, jadi saya berasumsi mereka pasti punya alasan yang bagus untuk itu. Hal ini dapat menyebabkan perilaku yang tidak terduga saat menjalankan shell login (seperti misalnya saat memasuki mesin misalnya) di mana pengguna tidak akan mengharapkan untuk ~/.bashrcbersumber.

Satu-satunya keuntungan yang dapat saya pikirkan adalah untuk tidak membingungkan pengguna dengan banyak file startup dan memungkinkan mereka untuk mengedit .bashrcsendiri dan membaca tanpa memperhatikan jenis shell. Namun, itu merupakan manfaat yang meragukan karena seringkali bermanfaat untuk memiliki pengaturan berbeda untuk login dan untuk shell interaktif dan ini menghalangi Anda untuk melakukannya. Juga, shell login sering tidak berjalan dalam lingkungan grafis dan yang dapat menyebabkan kesalahan dan peringatan dan masalah (oh my!) Tergantung pada apa yang Anda atur di file-file itu.

Jadi mengapa Ubuntu melakukan ini, apa yang saya lewatkan?

terdon
sumber
Mengapa -n "$BASH_VERSION"benar di luar bash?
Elliott Frisch
@ElliottFrisch tidak akan. Pertanyaan saya adalah mengapa .profilesumber .bashrc, itu tidak terjadi di semua versi Linux dan saya bertanya-tanya apa alasan di balik itu.
terdon
Tampaknya diimplementasikan seperti itu di debian hulu.
Elliott Frisch
@ ElliottFrisch ya, saya pikir itu tidak dan mencarinya dan melihat sudah waktunya untuk mengedit komentar saya. Namun demikian, ini bukan kasus pada sistem SuSe saya memiliki akses ke (meskipun pada CentOS satu) dan tidak terjadi pada berbagai sistem (Kesehatan Reproduksi, Fedoras, Ubuntus yang lebih tua) sejauh yang saya ingat. Jadi saya bertanya-tanya mengapa.
terdon

Jawaban:

15

Ini adalah keputusan hulu yang berasal dari Debian. Alasannya dijelaskan dalam posting wiki yang sangat bagus ini , di mana yang berikut ini adalah kutipannya. Ringkasan eksekutif adalah "untuk memastikan bahwa login GUI dan non GUI bekerja dengan cara yang sama":

Mari kita ambil xdm sebagai contoh. pierre kembali dari liburan suatu hari dan menemukan bahwa administrator sistemnya telah menginstal xdm pada sistem Debian. Dia masuk dengan baik, dan xdm membaca file .xsession-nya dan menjalankan fluxbox. Segalanya tampak baik-baik saja sampai ia mendapatkan pesan kesalahan di tempat yang salah! Karena ia menimpa variabel LANG dalam .bash_profile-nya, dan karena xdm tidak pernah membaca .bash_profile, variabel LANG-nya sekarang disetel ke en_US, bukan fr_CA.

Sekarang, solusi naif untuk masalah ini adalah bahwa alih-alih meluncurkan "xterm", ia dapat mengkonfigurasi window manager-nya untuk meluncurkan "xterm -l". Bendera ini memberi tahu xterm bahwa alih-alih meluncurkan shell normal, itu harus meluncurkan shell login. Di bawah pengaturan ini, xterm memunculkan / bin / bash tetapi ia menempatkan "- / bin / bash" (atau mungkin "-bash") dalam vektor argumen, jadi bash bertindak seperti shell login. Ini berarti bahwa setiap kali dia membuka xterm baru, ia akan membaca / etc / profile dan .bash_profile (perilaku bash bawaan), dan kemudian .bashrc (karena .bash_profile mengatakan untuk melakukan itu). Ini mungkin kelihatannya bekerja dengan baik pada awalnya - file-file dot-nya tidak berat, jadi dia bahkan tidak melihat penundaan - tetapi ada masalah yang lebih halus. Dia juga meluncurkan browser web langsung dari menu fluxbox-nya, dan browser web mewarisi variabel LANG dari fluxbox, yang sekarang disetel ke lokal yang salah. Jadi sementara xtermsnya mungkin baik-baik saja, dan apa pun yang diluncurkan dari xtermsnya mungkin baik-baik saja, browser webnya masih memberinya halaman di tempat yang salah.

Jadi, apa solusi terbaik untuk masalah ini? Sebenarnya tidak ada yang universal. Pendekatan yang lebih baik adalah memodifikasi file .xsession agar terlihat seperti ini:

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

Ini menyebabkan shell yang menerjemahkan skrip .xsession untuk membaca di / etc / profile dan .bash_profile jika ada dan dapat dibaca, sebelum menjalankan xmodmap atau xterm atau "mengeksekusi" window manager. Namun, ada satu kelemahan potensial untuk pendekatan ini: di bawah xdm, shell yang bertuliskan .xsession berjalan tanpa terminal pengendali. Jika / etc / profile atau .bash_profile menggunakan perintah apa saja yang mengasumsikan keberadaan terminal (seperti "keberuntungan" atau "stty"), perintah tersebut mungkin gagal. Ini adalah alasan utama mengapa xdm tidak membaca file-file itu secara default. Jika Anda akan menggunakan pendekatan ini, Anda harus memastikan bahwa semua perintah di "file dot" Anda aman untuk dijalankan ketika tidak ada terminal.

terdon
sumber
Saya masih berpikir itu bukan ide bagus. Yang ideal akan memastikan bahwa pengelola tampilan akan mencari profil global (centang) dan profil shell .profile. Sekarang saya tahu mengapa saya memiliki jalur duplikat dalam beberapa variabel ...
Rmano
2

Ini adalah perilaku standar Ubuntu, ~/.bashrcadalah file start-up per-interaktif-shell tingkat pengguna. Ketika Anda membuka terminal pada dasarnya, Anda memulai non-login, shell interaktif yang membaca ~/.bashrcdan isi dari ~/.bashrcsumber dan diekspor ke lingkungan shell Anda saat ini. Ini membantu seseorang untuk mendapatkan semua variabel dan fungsi shell yang didefinisikan penggunanya di shell saat ini. Anda juga dapat menemukan garis seperti ini

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

untuk mendapatkan alias yang ditentukan pengguna dalam lingkungan shell saat ini.

Ini penting untuk memberikan pengalaman pengguna yang baik juga. Misalnya orang bisa menyimpan di credential proxy yang .bashrc, kecuali mendapatkan satupun dari aplikasi terminal bersumber ( viz , ping, wget, curl, lynxdll) akan bekerja dengan baik. Atau Anda harus memberikan kredensial proxy setiap kali Anda membuka terminal.

Selain default Ubuntu .bashrcberisi banyak alias yang mudah digunakan (untuk lsdan grepuntuk mencetak output yang berwarna), banyak definisi baru untuk variabel shell yang berbeda yang meningkatkan pengalaman pengguna.

Tetapi jika login ssh Anda , atau login di konsol virtual , Anda pada dasarnya mendapatkan shell login interaktif. Ada file inisiasi shell ~/.profile. Karenanya, kecuali jika Anda sumber, ~/.bashrcAnda kehilangan semua pengaturan yang bermanfaat di Internet Anda .bashrc. Itulah sebabnya ~/.profilesumber default Ubuntu~/.bashrc

Kasus yang harus dihindari

  • Anda seharusnya tidak pernah sumber ~/.profilebentuk di dalam ~/.bashrcpada saat yang sama ~/.bashrcsedang bersumber dari ~/.profile. Ini akan membuat loop situasi tak terbatas dan sebagai akibatnya terminal prompt Anda akan ditangguhkan kecuali jika Anda menekan Ctrl+ C. Dalam situasi seperti itu jika Anda meletakkan garis di~/.bashrc
set -x

Maka Anda bisa melihat bahwa deskriptor file berhenti ketika Anda membuka terminal.

souravc
sumber
Terima kasih, ini semua informasi yang benar dan berguna. Itu tidak menjawab pertanyaan saya. Saya akrab dengan perbedaan antara shell login dan non-login. Pertanyaan saya adalah mengapa, pada sistem Ubuntu, .profilesumbernya .bashrc? SuSe Enterprise 10 tidak melakukannya, tidak juga versi Fedora yang saya gunakan tetapi itu bertahun-tahun yang lalu, saya mungkin salah. CentOS 5.8 tidak cukup aneh. Lagi pula, Anda mengerti maksud saya? Ini adalah pilihan desain dan saya bertanya-tanya mengapa itu dibuat.
terdon
Saya belum menggunakan distribusi Linux lain yang Anda sebutkan dengan ketat. dapat Anda ceritakan bagaimana mereka menangani situasi seperti perintah alias di sesi ssh yang didefinisikan dalam .bashrcatau dalam .bash_aliases. Sebagai contoh, saya memiliki alias untuk lsseperti ls --color=autodi saya .bashrcdan saya .bashrcmendapat bersumber dari saya .profile. Di sini saya dapat menggunakan alias bahkan dari ssh. Atau saya bisa menggunakan proxy di sesi ssh. Jika saya tidak mendapatkan .bashrcdari saya .profilesaya kehilangan fitur-fitur itu. Saya pikir ini semua tentang pengalaman pengguna yang lebih baik.
souravc
Mereka tidak, alias itu tidak akan bekerja. Dan ya, sumber .bashrcperbaikan itu. Tapi itu juga menyebabkan masalah, saya ingat pertama kali saya menggunakan sistem yang memiliki perilaku ini, saya terus menerima pesan-pesan aneh sshini karena itu saya gunakan xset b offdi saya .bashrcyang digunakan untuk menonaktifkan bel terminal tetapi hanya dalam sistem X sehingga sedang memberikan pesan kesalahan. Butuh waktu lama bagi saya untuk mencari tahu apa yang sedang terjadi karena saya tidak berpikir itu .bashrcakan dibaca ketika menjalankan shell login. Saya hanya ingin tahu apakah ada pernyataan "resmi" tentang ini.
terdon
Saya setuju dengan kamu. Saya juga menghadapi beberapa masalah sebelumnya . Tetapi sebagian besar bermanfaat dan ramah pengguna, jika Anda ingat dan menghindari beberapa kasus khusus. Bukan :)
souravc
Ya, ada alasan yang sah untuk ini. Saya hanya ingin tahu apakah Canonical pernah memberikan alasan mereka untuk menjaga keputusan ini.
terdon