-t FD
Benar jika FD adalah deskriptor file yang dikaitkan dengan terminal.
Jadi jika Anda menjalankan bash sebagai shell interaktif (terminal - lihat utas ini untuk penjelasan terminologi), bash akan diganti oleh zsh.
Lebih lanjut tentang file .bash *:
Ketika bash dipanggil sebagai shell login interaktif , atau sebagai
shell non-interaktif dengan opsi --login , ia pertama kali membaca dan menjalankan perintah dari file / etc / profile, jika file itu ada. Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca. Opsi --noprofile dapat digunakan ketika shell mulai menghambat perilaku ini.
Ketika shell login keluar , bash membaca dan mengeksekusi perintah dari file ~ / .bash_logout dan /etc/bash.bash_logout, jika file tersebut ada.
Ketika shell interaktif yang bukan shell login dimulai, bash membaca dan mengeksekusi perintah dari ~ / .bashrc , jika file itu ada. Ini dapat dihambat dengan menggunakan opsi --norc. Opsi file --rcfile akan memaksa bash untuk membaca dan menjalankan perintah dari file daripada ~ / .bashrc.
Stéphane Chazelas berkomentar:
Perhatikan bahwa shell dapat interaktif tanpa stdout menjadi terminal, dan shell dapat non-interaktif dengan terminal di stdout (seperti setiap kali Anda menjalankan skrip di dalam terminal tanpa mengarahkan / memipipkan outputnya), dan bashdapat baca .bashrcbahkan ketika tidak interaktif (seperti di ssh host cmdmana bashshell login pengguna di host, atau bash --login -c 'some code'). case $- in *i*)...adalah cara yang benar untuk menguji apakah shell bersifat interaktif.
Perhatikan bahwa shell dapat interaktif tanpa stdout menjadi terminal, dan shell dapat non-interaktif dengan terminal di stdout (seperti setiap kali Anda menjalankan skrip dalam terminal tanpa mengarahkan / memipipkan outputnya), dan bashdapat membaca .bashrcbahkan ketika tidak interaktif (seperti di ssh host cmdmana bashshell login pengguna di host, atau di bash --login -c 'some code'mana .bash_profilesumbernya .bashrc). case $- in *i*)...adalah cara yang benar untuk menguji apakah shell bersifat interaktif.
Stéphane Chazelas
@ StéphaneChazelas poin bagus. Saya akan berisi komentar Anda dalam jawaban
mrc02_kr
Ada sejumlah definisi "interaktif" yang berbeda. Jika shell menganggapnya interaktif, maka iakan diatur (dan di shell modern yang dapat diuji dengan ifdaripada harus menggunakan case). Tetapi ada banyak kasus penggunaan di mana orang hanya peduli jika stdout (atau stdin, atau stderr ...) terpasang ke terminal.
Mark Reed
9
The perintah uji[ -t 1 ] memeriksa apakah keluaran bash adalah pada terminal. Maksud garis ini jelas untuk menjalankan zsh saat membuka terminal, tanpa mengganggu penggunaan bash lainnya. Tapi itu dilakukan dengan sangat buruk.
File .bashrcdibaca dalam tiga keadaan:
Ketika bash dieksekusi sebagai shell interaktif, yaitu untuk menjalankan perintah yang diketik oleh pengguna daripada untuk mengeksekusi perintah batch.
Ketika bash adalah shell non-interaktif yang dijalankan oleh daemon RSH atau SSH (biasanya karena Anda menjalankan ssh host.example.com somecommanddan bash adalah shell login Anda aktif host.example.com).
[ -t 1 ]adalah cara yang buruk untuk mendeteksi kerang interaktif. Itu mungkin, tetapi jarang, untuk menjalankan bash secara interaktif dengan output standar tidak pergi ke terminal. Ini lebih umum untuk memiliki keluaran standar pergi ke terminal di shell non-interaktif; shell non-interaktif tidak memiliki bisnis yang berjalan .bashrctetapi sayangnya shell bash dipanggil oleh SSH do. Ada cara yang lebih baik: bash (dan shell gaya-sh lainnya) menyediakan metode bawaan yang andal untuk melakukannya.
case $-in*i*) echo this shell is interactive;;*) echo this shell is not interactive;;esac
Jadi "luncurkan zsh jika ini shell interaktif" harus ditulis
case $-in*i*) exec zsh;;esac
Tetapi bahkan itu bukan ide yang baik: mencegah bash shell, yang berguna bahkan jika Anda menggunakan zsh. Lupakan posting blog ini dan alih-alih konfigurasikan pintasan Anda yang membuka terminal untuk menjalankan zsh, bukannya bash. Jangan mengatur hal-hal sehingga "setiap kali Anda membuka aplikasi Bash di Windows, sekarang akan mulai dengan shell Zsh": ketika Anda ingin zsh, buka aplikasi Zsh.
Untuk rsh/ sshdan untuk shell interaktif, itu jika bukan shell login. Untuk shell login ( sshdtidak akan memulai shell login non-interaktif, tetapi Anda bisa melakukannya dengan ssh host exec bash -l), .bash_profiledibaca sebagai gantinya. Perhatikan juga bahwa untuk rsh/ ssh, Anda juga harus $SHLVLtidak disetel atau 0.
Contoh Anda dijalankan (menggantikan proses yang sedang berjalan, dalam kasus ini bash) dengan zshon jika stdout terbuka pada terminal (bukan file / pipa / dll).
bash
dapat membaca.bashrc
bahkan ketika tidak interaktif (seperti dissh host cmd
manabash
shell login pengguna di host, atau dibash --login -c 'some code'
mana.bash_profile
sumbernya.bashrc
).case $- in *i*)...
adalah cara yang benar untuk menguji apakah shell bersifat interaktif.i
akan diatur (dan di shell modern yang dapat diuji denganif
daripada harus menggunakancase
). Tetapi ada banyak kasus penggunaan di mana orang hanya peduli jika stdout (atau stdin, atau stderr ...) terpasang ke terminal.The perintah uji
[ -t 1 ]
memeriksa apakah keluaran bash adalah pada terminal. Maksud garis ini jelas untuk menjalankan zsh saat membuka terminal, tanpa mengganggu penggunaan bash lainnya. Tapi itu dilakukan dengan sangat buruk.File
.bashrc
dibaca dalam tiga keadaan:ssh host.example.com somecommand
dan bash adalah shell login Anda aktifhost.example.com
)..bash_profile
( pilihan file startup bash agak aneh ).[ -t 1 ]
adalah cara yang buruk untuk mendeteksi kerang interaktif. Itu mungkin, tetapi jarang, untuk menjalankan bash secara interaktif dengan output standar tidak pergi ke terminal. Ini lebih umum untuk memiliki keluaran standar pergi ke terminal di shell non-interaktif; shell non-interaktif tidak memiliki bisnis yang berjalan.bashrc
tetapi sayangnya shell bash dipanggil oleh SSH do. Ada cara yang lebih baik: bash (dan shell gaya-sh lainnya) menyediakan metode bawaan yang andal untuk melakukannya.Jadi "luncurkan zsh jika ini shell interaktif" harus ditulis
Tetapi bahkan itu bukan ide yang baik: mencegah bash shell, yang berguna bahkan jika Anda menggunakan zsh. Lupakan posting blog ini dan alih-alih konfigurasikan pintasan Anda yang membuka terminal untuk menjalankan zsh, bukannya bash. Jangan mengatur hal-hal sehingga "setiap kali Anda membuka aplikasi Bash di Windows, sekarang akan mulai dengan shell Zsh": ketika Anda ingin zsh, buka aplikasi Zsh.
sumber
rsh
/ssh
dan untuk shell interaktif, itu jika bukan shell login. Untuk shell login (sshd
tidak akan memulai shell login non-interaktif, tetapi Anda bisa melakukannya denganssh host exec bash -l
),.bash_profile
dibaca sebagai gantinya. Perhatikan juga bahwa untukrsh
/ssh
, Anda juga harus$SHLVL
tidak disetel atau 0.tes man 1 :
Contoh Anda dijalankan (menggantikan proses yang sedang berjalan, dalam kasus ini
bash
) denganzsh
on jika stdout terbuka pada terminal (bukan file / pipa / dll).sumber