Bir kabuğun etkileşimli modda çalışıp çalışmadığını nasıl bash olarak kontrol edebilirim?


45

Ben (de söyleyebilir nasıl ~/.bashrcben etkileşimli modda çalışıyor ya, demek, ssh üzerinden bir komut yürütme ediyorsam). ANSI kaçış dizilerinin .bashrcikincisiyse yazdırılmasını önlemek istiyorum .


Kaçış dizileri yazdırılıp yazdırılmayacağını seçmek, kabuğun etkileşimine değil, $ TERM değerine dayanarak daha iyidir. Değişken, kaçış dizilerini yorumlayan parça olan müşteri terminalinin yeteneklerini tanımlar.
eylül

Yanıtlar:


52

Göre man bash:

PS1 ayarlanır ve $ - eğer bash etkileşimli ise i bir kabuk betiğinin veya bir başlangıç ​​dosyasının bu durumu test etmesini sağlar.

Yani kullanabilirsiniz:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

Ayrıca:

Oturum açma kabuğu olmayan etkileşimli bir kabuk başlatıldığında, bash, bu dosyalar varsa, /etc/bash.bashrc ve ~ / .bashrc komutlarını okur ve çalıştırır.

Bu yüzden ~/.bashrcsadece etkileşimli mermiler için kaynaklı. Bazen, insanlar beklenen davranışı engellediğinden kaynaklı ~/.bash_profileya ~/.profileda yanlış olanı kullanırlar. Yaygın olan kodun bakımını basitleştirmek istiyorsanız, ortak kodu içeren ayrı bir dosya kullanmalı ve onu her iki rc dosyadan da bağımsız olarak almalısınız.

Giriş rcdosyalarından stdout çıktısı ~/.bash_profileyoksa ya da örneğin ~/.profiledüzgün çalışmasını engelleyebileceğinden en iyisidir rsync.

Her durumda, yanlış yapılandırma olabileceğinden, etkileşimi test etmek iyi bir fikirdir.


7
$ - mutlaka bir eşit değil, bir i içerebilir . Kullandığım[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@AlexHowansky: Eşitlik testindeki yıldız işaretleri bunu içerdiği için bir test yapari
Dennis Williamson,

Vay onları bile farketmedi, monitörümdeki çift tırnak gibi görünüyorlar. Yazı tipi boyutunu yükseltmek için zaman olabilir. <yaşlanıyor>
Alex Howansky 28:13

Bazen insanlar kaynak onu ~/.bash_profileya ~/.profileda beklenen davranışın müdahale beri yanlıştır Doğru. Eğer kaynak hakkında ne düşünüyorsunuz ~/.bashrcgelen ~/.bash_login? Giriş kabuğunun etkileşimli olması gerekmediğinden, sanırım bu da yanlış.
Piotr Dobrogost

1
@PiotrDobrogost: Bu kabuk başlangıç ​​dosyalarının mükemmel bir tartışması .
Dennis Williamson,

12

kullanın:

if tty -s; then echo interactive; fi

İşe görünmüyor
Steven Shaw

bu benim için de işe yaramıyor gibi görünüyor, bence bu doğru cevap: stackoverflow.com/a/49064632/1223975
Alexander Mills

bu standart girişte bir TTY varlığını kontrol eder; ilişkili olmasına rağmen, kabuğun "-i" bayrağıyla gösterilen, kabuğun etkileşimli moduyla aynı değildir.
yrk

Çalışmıyor. insanlar neden oylandı?
Setop

11

testaracı (erkek sayfasından) bu kontrol edebilirsiniz:

 -t FD          True if FD is opened on a terminal.

Yani örneğin kullanabilirsiniz:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

veya

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

Güzel ve kabukları arasında taşınabilir gibi görünüyor. TEST bash <<< 'test -t 0 && echo Y || echo X'yazıyor Y, bash -c 'test -t 0 && echo Y || echo X'yazıyorX
kyb

1
bu aynı zamanda standart girişin bir TTY olduğunu doğrular; Her ne kadar ilişkili olsa da, kabuğun "-i" bayrağı ile istenen ve belirtilen kabuğun etkileşimli moduyla aynı değildir.
yrk

6

Genellikle tty programının çıktısına bakarım.

Eğer bir tty kullanıyorsanız, hangi tty üzerinde olduğunuzu size söyleyecektir. İnteraktif modda değilseniz, genellikle "tty değil" gibi bir şey söyleyecektir.


3
Eğer bir terminalde iseniz ya da aksi halde size çıktı vermeden 1 iseniz, tty -s 0 dönüş değerini ayarlayacaktır. 'Tty -s ise' olarak kullanabilirsiniz; sonra etkileşimli; fi '
BillThor

Teşekkürler! Bu bir oldu uzun ... Ben bu tür bir şey yapmak için gerekli beri zaman ve ben bazı ayrıntıları unuttum sanırım
Chris
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.