Mengapa .bashrc tidak berjalan secara otomatis?

202

Saya menaruh beberapa perintah alias di .bashrcfile saya , sehingga mereka dapat dimuat setiap kali saya membuka jendela Terminal baru. Namun ini tidak terjadi.

Saya harus memilih run script:di Terminal> Preferensi> " MyDefaultTheme "> Shell prefpane dan menambahkan: source .bashrc && clearagar berfungsi ...

Ini tampak aneh karena banyak tutorial hanya mengatakan Anda hanya perlu menambahkan .bashrcfile dan semuanya baik-baik saja.

Perhatikan bahwa saya tidak menjalankan bashketika menggunakan terminal, saya suka yang lain (default) yang lebih baik (tidak tahu apa itu) lebih baik, karena itu menunjukkan kepada saya di mana saya sepanjang waktu misalnya:

>>d54c6b47b:~ romeo$

dari pada:

>>bash$

Dalam bash semua dimuat sebagaimana mestinya.

Jadi pertanyaan saya adalah, mengapa .bashrcfile saya tidak dimuat secara otomatis dan apakah saya harus menambahkan opsi untuk menyebutnya setiap kali?

Juga beberapa tutorial mengatakan kepada saya untuk melakukan sesuatu seperti:

$alias la=’ls -la >> ~/.bashrc

yang seharusnya menulis alias ke saya .bashrc, ini juga tidak berfungsi ...

Perhatikan bahwa saya seorang pemula UNIX, jadi bersikaplah lembut.

romeovs
sumber
Saya pikir ini sangat dekat dengan apple.stackexchange.com/questions/7984/… .
boehj
@ Boehj baik itu menyebutkan "tidak memuat .bashrc" tapi itu saja.
Jari Keinänen
OK, maaf kalau saya bingung di sini.
boehj
Anda mungkin lebih suka csh(atau varian lain). Tetapi Anda harus tahu bahwa itu >>bash$bisa diubah :)
vol7ron
Jika Anda ingin menjalankan perintah onload , buatlah .profiledi direktori home Anda
Kolob Canyon

Jawaban:

94

Masukkan saja ke dalam .profilefile Anda dari direktori home Anda dan itu akan berfungsi pada saat Anda memulai shell baru atau setelah Anda menjalankannyasource ~/.profile

Tautan ini dengan jelas menyatakan urutan di mana file startup dibaca dan dimuat oleh shell: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup

Cosu
sumber
menerima yang ini karena ini memiliki solusi (dan itu adalah yang pertama dari dua posting yang hampir sama).
romeovs
37
Dipilih turun. Saya merekomendasikan untuk tidak mengikuti saran ini. Masalahnya adalah bahwa Terminal membuat shell login, dan shell login Bash hanya menjalankan skrip startup login, bukan ~/.bashrc. Namun, solusinya bukan hanya menempatkan .bashrckonten Anda ke dalam file startup login, karena dua file ini dimaksudkan untuk melakukan berbagai jenis pengaturan. Alih-alih, pengaturan kanonik untuk Bash adalah memiliki ~/.bash_profilesumber Anda ~/.bashrcpada titik yang tepat dalam skrip (biasanya terakhir).
Chris Page
Saya tidak melihat postingan identik lainnya yang hanya tertulis di file sh
Mark
218

Pernah ke sana, melakukan itu. Apa yang saya sadari, OS X tidak membaca .bashrcfile saat bash start. Sebagai gantinya, ia membaca file-file berikut (dalam urutan berikut):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Lihat juga komentar informatif dan berguna Chris Johnsen :

Secara default, Terminal memulai shell via /usr/bin/login, yang menjadikan shell sebagai shell login. Pada setiap platform (bukan hanya Mac OS X) pesta tidak menggunakan .bashrckerang login (hanya /etc/profiledan pertama .bash_profile, .bash_login, .profileyang ada dan dapat dibaca). Inilah sebabnya mengapa "memasukkan source ~/.bashrcAnda .bash_profile" adalah saran standar

Saya biasanya hanya meletakkan hal-hal yang biasanya saya masukkan ~/.bashrcke ~/.profile- telah bekerja sejauh pesona.

Jari Keinänen
sumber
38
Secara default, Terminal memulai shell via /usr/bin/login, yang menjadikan shell sebagai shell login. Pada setiap platform (bukan hanya Mac OS X) pesta tidak menggunakan .bashrckerang login (hanya /etc/profiledan pertama .bash_profile, .bash_login, .profileyang ada dan dapat dibaca). Inilah sebabnya mengapa "memasukkan source ~/.bashrcAnda .bash_profile" adalah saran standar.
Chris Johnsen
5
Re "Saya biasanya hanya memasukkan hal-hal yang biasanya saya masukkan ~ / .bashrc ke ~ / .profile": Untuk kompatibilitas maksimum saya sarankan Anda mengikuti saran Chris Johnsen dan menempatkan apa pun yang ingin Anda terapkan ke shell non-login di ~ / .bashrc dan tambahkan "source ~ / .bashrc" ke ~ / .bash_profile Anda untuk menjalankannya untuk shell login. Jika tidak, ini tidak akan berfungsi untuk sub-shell, atau jika Terminal berubah untuk membuat shell non-login, atau jika Anda pernah menggunakan xterm atau program terminal lain yang membuat shell non-login secara default, atau jika Anda mungkin ingin menggunakan pengaturan yang sama pada OS lain.
Chris Page
4
Pada catatan terkait, pada Mac OS X Anda harus mempertimbangkan menjalankan ~ / .bashrc / etc / bashrc untuk mengambil perilaku global. Secara khusus, ada kode di / etc / bashrc untuk memperbarui direktori kerja di setiap prompt, yang memungkinkan Terminal untuk menampilkan ikon proxy, membuat terminal baru di direktori yang sama, dan mengembalikan direktori kerja untuk Resume dan Window Groups.
Chris Page
Bagi saya, sumber .bashrc dari .bash_profile tidak berfungsi. Tetapi sumber .bashrc / .bash_profile dari .profile berhasil.
Ken Russell
2
Jawaban yang bagus tetapi sedikit informasi yang salah. Saya percaya beban terminal pesta hanya satu dari ~/.bash_profile, ~/.profile, ~/.bash_login, tidak pernah semua mereka. Anda dapat menjalankan tes sederhana dengan membuat 3 file. Sepertinya terminal pesta memiliki preferensi ~/.bash_profile> ~/.bash_login> ~/.profile. Jika salah satu dari mereka ada, yang kurang disukai akan dilewati. Itu sebabnya kadang-kadang dianjurkan untuk juga sumber ~/.profiledi ~/.bash_profile.
neurite
25

Saya memasukkan semuanya ke dalam ~/.bashrcdan hanya source ~/.bashrcprofil.

Ini memungkinkan sesi layar dan xterm (dan saya kira tmux) mewarisi lingkungan saya karena sesi non-login hanya berjalan .bashrc, sedangkan sesi login (mis. Terminal atau iTerm) hanya berjalan .profile.

anu
sumber
1
Ini pendekatan saya. Dengan cara ini saya dapat mempertahankan .bashrc yang berfungsi pada kedua sistem ... dan saya dapat menaruh mac spesifik atau hal-hal seperti alias yang hanya untuk pekerjaan (di mana saya paling banyak menggunakan mac) dalam file .bash_profile saya.
Michael Durrant
2
Catatan yang .profileumum untuk beberapa shell dan hanya boleh berisi kode sh yang kompatibel dengan POSIX. Jika sumbernya .bashrcbisa dibilang mengandung kode spesifik-Bash (keberadaan .bashrcfile itu spesifik-Bash). Saya sarankan mengubah nama Anda .profilemenjadi .bash_profilekarena Anda menggunakannya dengan cara spesifik-Bash. Atau, masukkan kode generik .profiledan buat .bash_profilesumber itu .profiledan .bashrc.
Chris Page
19

Ada dua skenario:

  1. Anda menggunakan Linux
  2. Anda menggunakan Mac Os X

Untuk kedua Anda ingin sumber ~/.bashrcdi profil Anda yang dimuat, atau bersumber, ketika shell Anda untuk terminal Anda mulai.


LINUX

Di Linux, ~/.profilesecara otomatis sumber di shell Anda ketika dimulai. Jadi, jika Anda pergi ke terminal dan mengetik cd ~; ls -A, Anda akan melihat semua file dan direktori di direktori home Anda ( /home/usrname/). Anda akan melihat file bernama .profile. Ini adalah file yang secara otomatis "bersumber" ketika Anda memulai terminal.

Jika Anda ingin menambahkan alias dan fungsi ke ~/.bashrc(yang saya lakukan), maka Anda harus (di dalam ~/.profilemenambahkan pernyataan if yang memeriksa apakah ~/.bashrcfile non-kosong dan kemudian sumber itu.

Untuk memeriksa apakah Anda ~/.profilesudah memasukkan ini nano ~/.profile. Ini akan membukanya di editor teks (Anda dapat menggunakan gedit jika Anda tahu Anda memilikinya atau bahkan vim jika Anda tahu cara menggunakannya). Anda mungkin mendapatkan file teks kosong (Anda seharusnya tidak), tetapi jika Anda hanya melanjutkan. Jika Anda tidak melihat garis di mana pun yang mengatakan source ~/.bashrc, masukkan baris berikut di suatu tempat (letakkan di tempat yang wajar seperti di akhir atau awal dan bukan di tengah-tengah pernyataan if):

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

Ini memeriksa apakah ~/.bashrcfile tersebut tidak kosong (dengan jika [ -s ~/.bashrc ]), dan jika memang demikian, maka akan diambil sumbernya. Cukup mudah. Sekarang, Anda dapat menambahkan alias, fungsi, variabel, dll ke ~/.bashrc.


MAC OS X

Secara default, sumber Max OS X ~/.bash_profile. Untuk dapat menambahkan sesuatu ke ~/.bashrc(yang, lagi-lagi, apa yang saya lakukan di OS X, juga), maka Anda mengikuti prosedur yang sama seperti linux. Di terminal masukkan cd ~; nano .bash_profile. Periksa baris yang mengatakan source ~/.bashrcdan jika tidak ada tambahkan pernyataan if di atas ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi).


CATATAN

Saat menulis pernyataan if, pastikan untuk meninggalkan ruang di antara semuanya pada dasarnya (misalnya if [ -s ~/.bashrc]; then echo "found"; fitidak berfungsi karena tidak ada ruang antara ~/.bashrcdan ]- penerjemah akan berpikir ini adalah satu kata).

Jika Anda ingin mengetahui cara memeriksa hal-hal dalam pernyataan if lebih baik, pergi ke terminal dan masukkan man \[; ini pada dasarnya memberi Anda run-down dari pernyataan if. Sebagai contoh, if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fiperiksa apakah /path/to/filefile dan apakah dicetak ke stdout sesuai. Saya selalu merujuk ini juga untuk referensi yang lebih mudah dilihat dan cepat: 7.2. Menguji operator file .

Saya harap ini membantu. Saya ingat betapa bingungnya saya ketika saya memulai semua hal ini (yang belum lama ini); jadi, semoga sukses dengan usaha UNIX masa depan Anda!

Dylan
sumber
Di linux, .profilehanya bersumber jika shell Anda adalah shell login, jika .bashrctidak bersumber
smac89
11

Sourcing .profile di .bash_profile melakukannya untuk saya

echo 'source ~/.profile' >> ~/.bash_profile
Luis S
sumber
1
Sourcing .profile di .bash_profile adalah hal yang bagus untuk dilakukan, tetapi itu saja tidak akan menyebabkan .bashrc dijalankan oleh shell login. Profil. Anda pasti sudah bersumber .bashrc, yang dapat menyebabkan masalah jika Anda pernah menggunakan shell selain bash. Sebagian besar pengguna Mac tidak akan pernah mau, tetapi jika Anda melakukannya karena suatu alasan, ingat ini. :)
Terry N
Untuk memperluas apa yang dikatakan @TerryN: pastikan untuk mengambil .bashrcdari Anda .bash_profiledan bukan dari .profile. .bash_profilekhusus untuk Bash dan harus mencari dua lainnya.
Chris Page
6

Saya menemukan bahwa setelah menginstal rvm (auto-installer, tidak ada pengeditan manual) itu telah membuat ~/.bash_loginfile untuk dirinya sendiri, di mana saya sebelumnya tidak pernah memilikinya.

Namun, ini berarti bahwa ~/.profilepengaturan dan alias saya tidak lagi dimuat! Banyak pintasan menghilang. Saya pikir mereka berlari secara berurutan, tidak secara eksklusif: - /

saya tambahkan

. ~/.profile 

untuk ~/.bash_loginrantai hal-hal seperti yang saya harapkan.

dman
sumber
+1, ini adalah situasi yang saya alami. Saya menemukan bahwa .bash_login atau .bash_profile akan mencegah .profile dieksekusi ... Tidak tahu mengapa bash merasa perlu memiliki begitu banyak file startup yang saling bertentangan.
RichVel
.profileumum untuk beberapa shell yang berbeda dan hanya boleh berisi kode sh yang kompatibel dengan POSIX. .bash_profilekhusus untuk Bash dan dapat berisi kode khusus untuk Bash. Secara umum, jika Anda menggunakan Bash Anda harus memilih .bash_profilekecuali Anda berhati-hati untuk memastikan bahwa kode startup Anda tidak mengandung apa pun yang tergantung pada Bash. Program apa pun yang dibuat .bash_loginmungkin melakukannya karena mengandung kode khusus Bash, tetapi harus menyertakan kode ke sumber .profilejika ada.
Chris Page
3

Menempatkan ...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... masuk ~/.bashrc, lalu sumber ~/.bashrcke dalam saya ~/.bash_profile tidak berfungsi untuk program Terminal yang diinstal.

Tapi kemudian saya pergi ke menu drop-down Edit> Preferensi Profil , Judul dan tab Perintah , dan memilih Jalankan perintah sebagai shell login dari bagian perintah dari halaman itu.

Setelah melakukannya, memulai terminal baru menunjukkan hasil yang diinginkan ketika saya mengetik

 type rvm|head -1

yaitu "rvm adalah fungsi". Itu tidak melakukan itu sampai saya membuat perubahan ini, dan itu satu-satunya perubahan yang saya buat setelah .bash_profiledan .bashrcperubahan yang dijelaskan dalam jawaban lain di sini.

LiquidMark
sumber
2

Pertama-tama izinkan saya memberi tahu Anda bahwa itu ~/.bashrcadalah file yang dieksekusi setiap kali shell kedua dipanggil (saat menjalankan skrip shell, misalnya), dan ~/.profiledipanggil pada setiap login.

Jadi saya sarankan Anda untuk menulis . ~/.bashrcperintah di ~/.profilefile Anda , dan perintah ini akan mengeksekusi file bashrc setiap kali Anda login.

arun rana
sumber
ketika. profil dijalankan saat login secara otomatis mengeksekusi file .bashrc.
arun rana
jadi .bashrc dijalankan secara tidak langsung di setiap login
arun rana
1
bashrc adalah untuk kerang non-login. bash_profile / bash_login / profile / apa pun untuk shell login. Ini adalah sumber pertengkaran dalam jumlah besar, yang melibatkan apa yang disebut shell login atau tidak (sesi layar / tmux misalnya, terminal dalam lingkungan desktop, dll.). Itu belum tentu "shell kedua". Ini masalah masuknya shell.
Jason Salaz
3
Jika Anda pernah menggunakan shell yang bukan Bash, melakukan apa yang Anda jelaskan dapat menyebabkan masalah. .profile berlaku untuk semua shell dan .bashrc mungkin berisi bahasa yang tidak dimengerti oleh beberapa shell lainnya. Alih-alih .profile, masukkan apa yang Anda tulis di .bash_profile. (Juga, buat hal pertama .bash_profile menjadi "source .profile".)
Terry N
1

Saya mengalami masalah yang sama setelah menginstal rbenv di server jarak jauh saya (Digital Ocean) Ubuntu 16.04.

Entah bagaimana itu dibuat ~/.bash_profile. Itu sama ~/.bashrcpada sistem OS X.

Dan Ubuntu mulai membaca saja ~/.bash_profile, tetapi tidak ~/.bashrcsebagaimana mestinya.

Jadi saya hanya mencadangkan data saya ~/.bash_profiledengan ini:

mv ~/.bash_profile ~/.bash_profile.bak

Dan berganti nama menjadi tua ~/.bashrcuntuk~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Itu berhasil untuk saya. Setelah login ssh saya memuat semuanya ~/.bashrc.

zhisme
sumber
0

Dalam hal ini dapat membantu orang lain ...

Pastikan Anda mengedit .bashrcfile yang tepat untuk pengguna yang tepat. Saya memiliki masalah serupa menggunakan Vagrant. Setelah menjalankan file vagrant sshsaya .bashrctidak dijalankan. Solusinya sederhana karena saya pikir gelandangan masuk dengan pengguna bernama gelandangan, dan saya benar-benar masuk sebagai pengguna lain. Jadi saya mengedit .bashrcfile yang salah . Setelah mengedit .bashrcfile yang benar, alias saya dikenali.

Allen
sumber
-1

Omong-omong, jika Anda telah mengaktifkan ZSH, itu menggantikan bash!

Jadi semua ~/.bashrcfile itu tidak dimuat.

Anda harus mengatur alias Anda ~/.zshrcsebagai gantinya.

Frédéric Adda
sumber
-2

Untuk tetap menggunakan login gaya OSX .profiledan mendukung perilaku bash normal, .bashrcAnda dapat menggunakan .bashrcfile jika Anda beralih antara nix biasa dan OSX dengan memberikan tautan simbolis ke .bashrcfile yang dipanggil .bash_profile. Pastikan file ini belum ada sebelum mencoba ini, tetapi ini adalah bagaimana saya melakukannya.

ln -s .bashrc .bash_profile
Inkspeck
sumber
Dengan melakukan ini menghubungkan antara 2 skrip inisialisasi shell yang berbeda, Anda kehilangan pemisahan fungsi yang diperlukan. Satu hari atau yang lain Anda akan membutuhkan inisialisasi di level sesi ( .bash_profile) dan inisialisasi berbeda di setiap level shell ( .bashrc).
dan
-2

/ etc / bashrc adalah untuk profil global pada sistem mac. Anda dapat menambahkan: alias ls = "ls -G" di bagian atas file ini dan barang Anda, semua orang akan memiliki file dan folder berwarna pada sistem sehingga Anda tidak perlu mengatur apa pun tambahan untuk setiap pengguna individu. Anda juga akan melihat "sudo su -" untuk melakukan rooting dari diri Anda. Anda masih akan memiliki file dan folder berwarna tanpa sakit kepala tambahan.

Kiat lain yang menyenangkan: Saat menggunakan mac Iterm2, mengimpor profil warna akan membuat pewarnaan file dan folder segera sesuai dengan skema warna Anda setelah set opsi "/ etc / bashrc" ini.

Sulayman Touray
sumber