Apa yang [-t 1] periksa?


Jawaban:


14

[]adalah pintasan testperintah.

Menurut man test:

-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.


4
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).
  • Ketika dipanggil secara eksplisit, misalnya dalam pengguna .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 .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.
Stéphane Chazelas

5

tes man 1 :

-t FD

deskriptor file FD dibuka pada terminal

Contoh Anda dijalankan (menggantikan proses yang sedang berjalan, dalam kasus ini bash) dengan zshon jika stdout terbuka pada terminal (bukan file / pipa / dll).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.