Test komutu [ -t 1 ] kontrol Bash çıkış bir terminal olup. Bu hattın amacı, bir terminali açarken bash'ın diğer kullanımlarını bozmadan zsh'yi çalıştırmaktır. Ama çok kötü yapıldı.
Dosya .bashrcüç durumda okunur:
- Bash etkileşimli kabuk olarak yürütüldüğünde, yani toplu komutları yürütmek yerine kullanıcı tarafından yazılan komutları çalıştırmak için.
- Bash, bir RSH veya SSH arka plan programı tarafından çalıştırılan etkileşimli olmayan bir kabuk olduğunda (genellikle çalıştığınız
ssh host.example.com somecommandve bash oturum açma kabuğunuz olduğu için host.example.com).
- Açıkça çağrıldığında, örneğin bir kullanıcının
.bash_profile( bash'ın başlangıç dosyaları seçimi biraz gariptir ).
[ -t 1 ]etkileşimli kabukları tespit etmenin kötü bir yoludur. Bir terminale gitmeyen standart çıkış ile bash'ı etkileşimli olarak çalıştırmak mümkündür, ancak nadirdir. Etkileşimli olmayan bir kabuktaki bir terminale standart çıkışın sağlanması daha yaygındır; etkileşimli olmayan bir kabukta iş yok .bashrcama maalesef SSH tarafından çağrılan bash kabukları var. Çok daha iyi bir yol var: bash (ve diğer herhangi bir sh tarzı kabuk) bunu yapmak için yerleşik, güvenilir bir yöntem sağlar.
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
Bu yüzden “bu etkileşimli bir kabuksa zsh başlat” yazılmalıdır
case $- in
*i*) exec zsh;;
esac
Ancak bu bile iyi bir fikir değildir: zsh kullansanız bile yararlı olan bir bash kabuğunun açılmasını önler. Bu blog gönderisini unutun ve bunun yerine basitçe bir terminal açan kısayolunuzu bash yerine zsh çalıştıracak şekilde yapılandırın. “Windows'ta Bash uygulamasını her açtığınızda, şimdi Zsh kabuğuyla başlayacak” şeyleri düzenlemeyin: zsh istediğinizde, Zsh uygulamasını açın.
bashokuyabilir.bashrcetkileşimli ( kullanıcının ana bilgisayarda oturum açma kabuğununssh host cmdneredebasholduğu veya kaynaklarınbash --login -c 'some code'nerede olduğu.bash_profilegibi.bashrc).case $- in *i*)...bir kabuğun etkileşimli olup olmadığını test etmenin doğru yoludur.