Mulai ulang bash dari terminal tanpa memulai ulang aplikasi terminal (mac)?

46

Saya telah melihat sekeliling dan menggigit jawaban untuk pertanyaan ini, tetapi sepertinya saya tidak menemukannya (yang aneh).

Pertanyaan saya adalah, adakah cara sederhana untuk memulai kembali sesi bash dari dalam terminal di mac. Saya hanya ingin perilaku yang sama seperti jika saya menutup aplikasi terminal dan mulai lagi (semua variabel reset, .bash_profile bersumber dll).

Saya tahu cara mencari .bash_profile, tapi bukan itu yang saya inginkan. Salah satu alasan saya ingin melakukan ini adalah karena sebuah plugin untuk bash prompt saya memiliki kode yang mencegah warna dimuat beberapa kali. Oleh karena itu, sumber .bash_profile tidak memuat ulang variabel warna dan saya harus memulai ulang aplikasi terminal untuk mendapatkan perubahan yang berlaku.

Mattias
sumber

Jawaban:

65

exec bash harus mengganti proses shell saat ini dengan (instance baru dari) bash.

Muzer
sumber
2
Apakah bash di aplikasi terminal shell interaktif, dan tidak exec bashhanya restart shell interaktif itu? Juga, dapatkah Anda menjelaskan dengan tepat apa yang dilakukan oleh perintah exec dan opsinya? Terima kasih!
Mattias
exec mengganti proses saat ini dengan yang baru. Bash memiliki halaman buku yang ditulis dengan sangat baik tetapi sayangnya sulit dicari; ketik man bash, cari instance terakhir dari string SHELL BUILTIN COMMANDS dan kemudian gulir ke bawah ke exec. Singkatnya, melewati -cbendera akan menjalankannya tanpa variabel lingkungan (yang mungkin diperlukan untuk tujuan Anda, saya tidak tahu), dan argumen lain -l dan -a mungkin bukan hal yang Anda inginkan (mereka tampaknya historis / fitur tidak jelas dan spesifik). Anda juga dapat menggunakan exec untuk membuka deskriptor file baru di shell saat ini, jika Anda meninggalkan perintah.
Muzer
Bisakah Anda menunjukkan contoh bagaimana menggunakan exec untuk membuka deskriptor file baru di shell saat ini? Dan bagaimana dengan pertanyaan saya tentang shell interaktif / login. Apakah shell dijalankan di terminal shell interaktif, dan semua perintah exec menyentuh. Terakhir, ini jawaban disetujui pertanyaan ini merekomendasikan perintah exec dengan bendera l, tapi saya tidak mengerti apa yang dilakukannya. Maaf telah bertanya terlalu banyak, saya hanya ingin memiliki pemahaman tentang perintah yang saya gunakan.
Mattias
1
Maaf ya Saya tidak yakin tentang Mac, tetapi di dunia Linux setidaknya shell dijalankan dari terminal grafis (biasanya) bukan shell login, dan Anda hanya memulai kembali shell interaktif dan bukan terminal itu sendiri atau shell login Anda. -ldi sini ada argumen untuk bash dan membuatnya berperilaku seperti shell login. Membuka deskriptor file di shell saat ini tidak ada hubungannya dengan pertanyaan Anda, tetapi Anda dapat menggunakan exec 4<>test.txtmisalnya untuk membuat deskriptor file 4 poin ke test.txt. Kemudian di sisa shell Anda dapat Anda lakukan echo test>&4untuk output ke test.txt.
Muzer
1
@Muzer untuk alasan yang tidak bisa saya katakan sepenuhnya setuju, OSX telah memutuskan bahwa emulator terminal GUI akan menjalankan shell login .
terdon
1

Jawaban yang diterima bagus untuk shell yang menggunakan bash, yang juga apa yang diminta OP, namun, saya menggunakan Terminal pada macOS dengan shell non-default (zsh) dan menjalankan perintah exec bashjelas tidak memiliki efek yang diinginkan : meluncurkan bash, bukan shell default saya.

Jadi perintah environment-agnostic adalah exec $SHELLyang menggunakan variabel environment $SHELLyang menyimpan shell default untuk pengguna.

Juga, perhatikan bahwa Apple akan mengganti bash dengan zsh di macOS Catalina sehingga untuk mendapatkan efek OP sedang mencari untuk menjalankan exec zshatau exec $SHELLakan menjadi cara untuk pergi setelah memperbarui ke macOS 10.15.

phip
sumber