Bagaimana cara memuat ulang .bashrc tanpa keluar dan kembali?

1645

Jika saya melakukan perubahan .bashrc, bagaimana cara memuat ulang tanpa keluar dan kembali?

Jed Daniels
sumber

Jawaban:

2638

Anda hanya perlu memasukkan perintah:

source ~/.bashrc

atau Anda dapat menggunakan versi perintah yang lebih pendek:

. ~/.bashrc
George Hawkins
sumber
88
Ini tidak persis sama dengan masuk dan mundur. Katakanlah Anda memiliki baris berikut di .bashrc:, export PATH=$PATH:foodan kemudian Anda ubah menjadi export PATH=$PATH:bar. Jika Anda masuk dan keluar, hanya barakan berada di PATH, tetapi jika Anda melakukan apa yang Anda sarankan, keduanya foodan barakan berada di PATH. Apakah Anda tahu jalan keluarnya?
HighCommander4
7
@ HighCommander4 - cara yang sangat tidak memuaskan untuk melakukan apa yang Anda inginkan adalah melakukan "bash -l" namun ini sebenarnya membuat subkulit baru dan ketika Anda logout Anda akan kembali ke shell penutup di mana "foo" masih di PATH. Jika Anda hanya tertarik pada PATH, Anda bisa melakukan "unset PATH" dan merekonstruksi dari awal, tetapi mungkin lebih mudah / aman adalah melakukan "PATH = / bin: / usr / bin" sebelum sumber .bashrc Anda. Bagaimana variabel PATH dibangun pada login sebenarnya cukup kompleks, melibatkan input paling tidak dari login (lihat "login man") dan / etc / profile (lihat "man bash").
George Hawkins
2
@Alex Anda dapat mengotomatiskannya dengan menambahkan baris ~ / .bashrc ke ~ / .bash_profile, meskipun saya tidak tahu apakah ini praktik yang baik.
Vivek Gani
4
Saya juga merekomendasikan membuat alias (yang bisa Anda simpan di ~ / .bashrc atau ~ / .bash_aliases) yang membuka .bashrc, dan memuatnya kembali setelah editor keluar. Anda dapat melakukannya dengan menggabungkan dua perintah dalam sebuah alias, misalnya seperti begitu (jika vim adalah editor pilihan Anda, jika tidak swap keluar untuk sesuatu yang lain): alias editbashrc='vim ~/.bashrc; source ~/.bashrc'. Ini akan membuat pengeditan menjadi lebih lancar, karena Anda tidak perlu memikirkan pemuatan ulang, setelah melakukan pengeditan, jika menggunakan alias khusus.
Samuel Lampa
6
Ini hanya akan mempengaruhi terminal saat ini.
matepal297
284

Atau Anda bisa menggunakan:

exec bash

Ini melakukan hal yang sama, dan lebih mudah diingat (setidaknya untuk saya).

The execperintah sepenuhnya menggantikan proses shell dengan menjalankan tertentu baris perintah. Dalam contoh kami, ini menggantikan apa pun shell saat ini dengan contoh baru bash(dengan file konfigurasi yang diperbarui).

WhoSayIn
sumber
13
Bisakah Anda jelaskan perbedaan source .bashrcperintah dan exec bash?
muradin
18
@muradin, sourceadalah perintah shell built-in yang mengeksekusi konten file yang dilewatkan sebagai argumen, dalam shell saat ini . Jadi, dalam contoh Anda, ia mengeksekusi file .bashrc di shell saat ini. Dan execperintah mengganti shell dengan program yang diberikan, dalam contoh Anda, ia menggantikan shell Anda dengan bash (dengan file konfigurasi yang diperbarui)
WhoSayIn
3
Dalam keadaan hiper-spesifik saya, ini benar-benar mengguncang. Dockerfile saya menjalankan skrip instal yang memodifikasi .bashrc. Saya kemudian membutuhkan itu untuk memuat ulang, tetapi . ~/.bashrcakan mengeksekusi di dashbukan bash, jadi ada kesalahan karena shopthilang. sourcetidak ditemukan dari shell, sehingga solusinya juga keluar. Saya mencoba ini dan gambar buruh pelabuhan dibangun dengan lancar!
m59
9
Elegan, tetapi "melakukan hal yang sama" tidak sepenuhnya benar. source ~/.bashrcakan melindungi seluruh lingkungan shell Anda (meskipun kemungkinan dimodifikasi oleh sumber ~/.bashrc), sedangkan exec bashhanya akan mempertahankan variabel lingkungan shell Anda saat ini (setiap perubahan ad-hoc ke shell saat ini dalam hal variabel shell, fungsi, opsi hilang). Tergantung pada kebutuhan Anda, satu atau lebih pendekatan lain mungkin lebih disukai.
mklement0
12
@SEoF, ketika Anda mengatakan "bash inception" dan jika Anda berpikir apa yang saya pikir Anda pikirkan, saya harus mengatakan bahwa Anda salah. Berbeda dengan film, Anda tidak terus menjadi bash dari bash ketika Anda berulang kali melakukannya exec bash. The execperintah menggantikan shell dengan program ini, dalam kasus kami, bash. Jadi, selalu ada satu contoh bash yang ada di terminal.
John Red
121

Untuk melengkapi dan membedakan dua jawaban paling populer, . ~/.bashrcdan exec bash:

Kedua solusi memuat ulang secara efektif~/.bashrc , tetapi ada perbedaan:

  • . ~/.bashrcatau source ~/.bashrcakan melindungi shell Anda saat ini :

    • Kecuali untuk modifikasi yang reload ~/.bashrcke dalam shell saat ini ( sumber ) membuat, yang shell saat ini dan keadaan yang diawetkan , yang meliputi variabel lingkungan, variabel shell, pilihan shell, fungsi shell, dan sejarah perintah.
  • exec bash, atau, lebih kuat lagi, exec "$BASH"[1] , akan mengganti shell Anda saat ini dengan instance baru, dan karenanya hanya mempertahankan variabel lingkungan shell Anda saat ini (termasuk yang telah Anda tetapkan secara ad-hoc).

    • Dengan kata lain: Setiap perubahan ad-hoc ke shell saat ini dalam hal variabel shell, fungsi shell, opsi shell, sejarah perintah hilang.

Tergantung pada kebutuhan Anda, satu atau lebih pendekatan lain mungkin lebih disukai.


[1] exec bashsecara teori dapat mengeksekusi executable yang berbeda bash dari yang memulai shell saat ini, jika kebetulan ada di direktori yang terdaftar sebelumnya di $PATH. Karena variabel khusus $BASHselalu berisi path lengkap dari executable yang memulai shell saat ini, exec "$BASH"dijamin untuk menggunakan executable yang sama .
Sebuah catatan di "..."sekitar $BASH: kutip ganda memastikan bahwa nilai variabel digunakan apa adanya, tanpa interpretasi oleh Bash; jika nilainya tidak memiliki ruang yang disematkan atau karakter meta shell lainnya (yang tidak mungkin dalam kasus ini), Anda tidak benar-benar membutuhkan tanda kutip ganda, tetapi menggunakannya adalah kebiasaan yang baik untuk dibentuk.

mklement0
sumber
Anda menjawab pertanyaan saya sebelum saya bisa menanyakannya. Ini bagus untuk diketahui; Saya sering mengatur CLASSPATH saya untuk satu sesi.
swinefish
Jadi, bahkan jika saya memanggil exec "$ BASH" akankah variabel yang set .bashrc ditemukan di shell yang saya buka berikutnya (menggunakan executable yang sama dengan sesi saya saat ini)?
nitinr708
3
@ nitinr708: Ya, exec $BASHakan sumber ~/.bashrc, jadi Anda akan melihat perubahannya ke lingkungan shell di sesi baru.
mklement0
@ Gaming32, saya menghargai gagasan tentang catatan kaki hyper-linked, tetapi itu tidak benar-benar bekerja (dan dalam jawaban sesingkat ini, itu tidak terlalu penting).
mklement0
44

Seseorang mengedit jawaban saya untuk menambahkan bahasa Inggris yang salah, tetapi di sini adalah yang asli, yang lebih rendah daripada jawaban yang diterima.

. .bashrc
Randy Proctor
sumber
25
Ini hanya akan berfungsi jika direktori Anda saat ini sebenarnya adalah direktori home Anda. Berikut ini akan berfungsi:. ~ / .bashrc
Brian Showalter
6
Apa yang membuat ini bekerja? Apa yang sebenarnya terjadi ketika saya melakukan ".bashrc"? Terima kasih!
Jed Daniels
54
. adalah pintasan BASH untuk perintah builtin "source". Jadi ".bashrc" sama dengan "sumber .bashrc" ke penerjemah BASH.
Brian Showalter
7
Keren. Terima kasih. Sekarang saya tidak tahu.
Jed Daniels
2
Saya baru saja mengirim permintaan edit untuk ditambahkan ~/, tetapi karena jawaban teratas menunjukkan keduanya source ~/.bashrcdan . ~/.bashrcsaya ingin tahu apakah jawaban ini hanya akan dihapus sebagai berlebihan.
Max Ghenis
18

Tergantung pada lingkungan Anda, ketikkan saja

bash

mungkin juga berfungsi.

James
sumber
15
Namun, ini akan memanggil shell baru di dalam shell saat ini, sehingga menghabiskan sumber daya. Lebih baik gunakan solusi exec @ WhoSayln yang menggantikan shell saat ini dengan yang baru dipanggil.
Bernhard Wagner
ya gunakan saja sumbernya. Ini sama sekali tidak perlu dan menyebalkan.
dylnmc
Selain komentar @ BernhardWagner, Anda juga kehilangan riwayat bash Anda saat ini jika menelurkan shell baru
peterchaula
Ini adalah solusi yang baik dimana akses privilege pengguna terbatas.
Tunde Pizzle
menjalankan subproses menambah lapisan kompleksitas yang tidak memiliki nilai tambahan.
Alan Berezin
18

Dengan ini, Anda bahkan tidak perlu mengetikkan "source ~ / .bashrc":

Sertakan file bashrc Anda:

alias rc="vim ~/.bashrc && source ~/.bashrc"

Setiap kali Anda ingin mengedit bashrc Anda, jalankan saja alias " rc "

Roy Lin
sumber
5

Bergantung pada lingkungan Anda, Anda mungkin ingin menambahkan skrip agar .bashrc memuat secara otomatis saat Anda membuka sesi SSH. Saya baru-baru ini melakukan migrasi ke server yang menjalankan Ubuntu, dan di sana, profil., Tidak. Bashrc atau. Bash_profile dimuat secara default. Untuk menjalankan skrip apa pun di .bashrc, saya harus menjalankan source ~/.bashrcsetiap kali sesi dibuka, yang tidak membantu ketika menjalankan penyebaran jarak jauh.

Agar bashrc Anda memuat secara otomatis saat membuka sesi, coba tambahkan ini ke .profile:

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

Buka kembali sesi Anda, dan itu akan memuat semua jalur / skrip yang Anda miliki di .bashrc.

karolus
sumber
Saya memiliki ini di "profil" tetapi tidak berfungsi - setiap kali saya keluar, saya harus melakukannya dengan tangan. Ada saran?
Wayne Smallman
4

Saya menggunakan easyengine untuk mengatur server berbasis cloud vultr saya.
Saya menemukan file bash saya di /etc/bash.bashrc.

Begitu source /etc/bash.bashrcjuga trik untuk saya!

memperbarui

Saat mengatur server telanjang (ubuntu 16.04), Anda dapat menggunakan info di atas, ketika Anda belum menyiapkan nama pengguna, dan masuk melalui root.

Cara terbaik untuk membuat pengguna (dengan sudo privledges), dan login sebagai nama pengguna ini sebagai gantinya.
Ini akan membuat direktori untuk pengaturan Anda, termasuk file .profile dan .bashrc.
https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/

Sekarang, Anda akan mengedit dan (dan "sumber") ~/.bashrcfile tersebut.

Di server saya, ini terletak di /home/your_username/.bashrc
( di mana your_usernamesebenarnya nama pengguna baru yang Anda buat di atas, dan sekarang masuk dengan)

SherylHohman
sumber
4

exec bash adalah cara yang bagus untuk mengeksekusi kembali dan meluncurkan shell baru untuk menggantikan yang sekarang. hanya untuk menambah jawabannya, $ SHELL mengembalikan shell saat ini yang merupakan bash. Dengan menggunakan berikut ini, itu akan memuat ulang shell saat ini, dan tidak hanya ke bash.

exec $SHELL -l;

Jimmy MG Lim
sumber
3

Bagi saya yang berfungsi ketika saya mengubah PATH adalah: exec "$BASH" --login

Cecília Assis
sumber
Pertanyaannya adalah tentang memuat ulang ~/.bashrc, yang tidak--login akan (secara langsung) dimuat kembali; di tingkat pengguna, itu akan memuat ulang (atau atau ) sebagai gantinya. ~/.bash_profile~/.bash_login~/.profile
mklement0
3

Tipe:

source ~/.bashrc

atau, dalam bentuk yang lebih pendek:

. ~/.bashrc

jwismar
sumber
1
Sekali lagi, hanya berfungsi jika Anda berada di direktori home, atau lebih tepatnya, di direktori di mana .bashrcberada. Cara yang lebih tepat untuk melakukan ini, sebagaimana diceritakan dalam jawaban yang diterima, adalah source ~/.bashrc.
John Red
2

saya menggunakan perintah berikut di msysgit

. ~/.bashrc

versi lebih pendek dari

source ~/.bashrc
Sojan V Jose
sumber
@ jwg jawaban yang diterima adalah. .bashrc. hanya akan berfungsi jika Anda berada di direktori home di msysgit.
Sojan V Jose
@ jwg ok saya kurus saya menyebutkan bahwa Anda tidak perlu mengetikkan 'sumber ~ / .bashrc' sebagai gantinya gunakan versi yang lebih pendek.
Sojan V Jose
@ jwg oke saya menambahkannya sebagai edit ke jawaban asli :)
Sojan V Jose
Mengapa jawaban yang berlebihan @ Sojan?
nitinr708
@ nitinr708 2014. saya hampir tidak ingat: P. jawaban aslinya diedit kemudian sesuatu yang saya kira.
Sojan V Jose
2

Dengan asumsi shell interaktif, dan Anda ingin menyimpan riwayat perintah Anda saat ini dan juga memuat / etc / profile (yang memuat data lingkungan termasuk / etc / bashrc dan pada Mac OS X memuat jalur yang ditentukan di /etc/paths.d/ via path_helper), tambahkan riwayat perintah Anda dan lakukan exec bash dengan opsi login ('-l'):

history -a && exec bash -l
beattidp
sumber
1

Ini juga akan berfungsi ..

cd ~
source .bashrc
kirti
sumber
7
Ya, tetapi juga mengubah direktori kerja ke ~, yang tidak diinginkan.
Albin
1
Terima kasih telah menjaga konteks agar tetap hidup @Krinkle
nitinr708
Apakah perlu menentukan ~untuk mengubah direktori kerja ke direktori home user?
Kenly
1

Saya perhatikan bahwa exec bashperintah murni akan menjaga variabel lingkungan, jadi Anda perlu menggunakan exec -c bashuntuk menjalankan bash di lingkungan kosong.

Misalnya, Anda masuk bash, dan export A=1, jika Anda exec bash, bash A == 1.

Jika Anda exec -cl bash, Akosong.

Saya pikir ini adalah cara terbaik untuk melakukan pekerjaan Anda.

Kucing anjing
sumber
-2

saya pribadi punya

alias ..='source ~/.bashrc'

di bashrc saya, sehingga saya bisa menggunakan ".." untuk memuatnya kembali.

Flo
sumber
4
Banyak orang menggunakan ..sebagai alias untuk cd .., jadi itu akan sangat membingungkan.
The Godfather
kecuali nama alias 'ide bagus. alias rehash='source ~/.bashrc'adalah pilihan saya.
Frank Nocke
gunakan sesuatu seperti "_rs" yang saya gunakan untuk reload shell. saya cukup banyak menggunakan _ untuk memulai alias saya; yang mirip dengan js libs underscorejs atau lodash.
Jimmy MG Lim