[-T 1] neyi kontrol eder?


Yanıtlar:


14

[]testkomutun kısayolu .

Göre man test:

-t FD
FD, bir terminalle ilişkilendirilmiş bir dosya tanıtıcıysa doğrudur.

Eğer bash'ı etkileşimli kabuk olarak çalıştırıyorsanız (terminal - terminoloji açıklaması için bu konuya bakın ), bash'ın yerini zsh alır.

.Bash * dosyaları hakkında daha fazla bilgi:

Bash etkileşimli bir giriş kabuğu veya --login seçeneğiyle etkileşimli olmayan bir kabuk olarak çağrıldığında , dosya varsa / etc / profilinden komutları okur ve yürütür. Bu dosyayı okuduktan sonra ~ / .bash_profile, ~ / .bash_login ve ~ / .profile bu sırayla arar ve var olan ve okunabilir olan ilk komutları okur ve yürütür. --Noprofile seçeneği, kabuk bu davranışı engellemeye başladığında kullanılabilir.

Bir giriş kabuğu çıktığında , bash ~ / .bash_logout ve /etc/bash.bash_logout dosyalarından komutları okur ve yürütür.

Oturum açma kabuğu olmayan bir etkileşimli kabuk başlatıldığında, bash bu dosya varsa ~ / .bashrc'den komutları okur ve yürütür . Bu, --norc seçeneği kullanılarak engellenebilir. --Rcfile dosyası seçeneği bash komutunu ~ / .bashrc yerine dosyadan okumaya ve yürütmeye zorlar.

Stéphane Chazelas comment:
bir kabuk stdout'ta bir terminal olmadan etkileşimli olabilir ve bir kabuk, bir stdout'ta terminale (her zaman gibi onun çıkış boru / yönlendirme olmadan bir terminal içinde bir komut dosyası çalıştırmak) ve ile etkileşimli olmayan olabileceğini Not bashcan .bashrcetkileşimli olmasa bile oku ( kullanıcının ana bilgisayarda oturum açma kabuğunun ssh host cmdnerede basholduğu gibi veya bash --login -c 'some code'). case $- in *i*)...bir kabuğun etkileşimli olup olmadığını test etmenin doğru yoludur.


4
Bir kabuğun stdout terminali olmadan etkileşimli olabileceğini ve bir kabuğun stdout üzerindeki bir terminalle etkileşimli olmayabileceğini unutmayın (çıkışını yeniden yönlendirmeden / pipetlemeden terminalde bir komut dosyası her çalıştırdığınızda olduğu gibi) ve olmasa bile bashokuyabilir .bashrcetkileşimli ( kullanıcının ana bilgisayarda oturum açma kabuğunun ssh host cmdnerede basholduğu veya kaynakların bash --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.
Stéphane Chazelas

@ StéphaneChazelas iyi bir nokta.
Yorumunuzu

"Etkileşimli" nin birçok farklı tanımı vardır. Kabuk etkileşimli olduğunu düşünürse , o izaman ayarlanır (ve ifkullanmak zorunda kalmak yerine test edilebilecek modern kabuklarda case). Ancak, bir terminalin sadece stdout (veya stdin veya stderr ...) bağlıysa umurunda olduğu birçok kullanım durumu vardır.
Mark Reed

9

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.


İçin rsh/ ssho eğer ve etkileşimli kabuk için, bu kadar değil bir giriş kabuğu. Giriş kabukları için ( sshdetkileşimli olmayan bir giriş kabuğu başlatmazsınız, ancak bunu yapabilirsiniz ssh host exec bash -l), .bash_profilebunun yerine okunur. Ayrıca, rsh/ için de ayarlanmamış veya 0 olması sshgerektiğini unutmayın.$SHLVL
Stéphane Chazelas

5

adam 1 testi :

-t FD

dosya tanımlayıcı FD terminalde açıldı

İşletme Örnek yürütür (yerine geçer, bu durumda, işlem çalışan bashile) zshise ilgili stdout'u bir terminal (değil vb dosya / boru /) açıktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.