Şu anda hangi terminal emülatörünün kullanıldığını nasıl kontrol edebilirim?


15

Gnome terminali ve Guake yüklü. Başlarken bu terminal öykünücülerinde görüntülenecek farklı başlangıç ​​iletileri vermek istiyorum. Bunun gerçekleşmesi için .bashrc içine hangi kodu yazmalıyım?

Yanıtlar:


10

Bu işlev işi yapmalıdır:

container() {
    pid=$$
    while true; do
        pid=$(ps -h -o ppid -p $pid 2>/dev/null)
        case $(ps -h -o comm -p $pid 2>/dev/null) in
        (gnome-terminal) echo "Running in gnome terminal";return;;
        (xterm) echo "Running in xterm";return;;
        (rxvt) echo "Running in rxvt";return;;
        (python) if [ ! -z "$(ps -h -o args -p $pid 2>/dev/null | grep guake)" ]; then echo "Running in Guake"; return; fi ;;
        esac
        [[ $(echo $pid) == 1 ]] && break
    done
}
container

Güzel cevap! İşlevi containertanımdan sonra çağırmayı unutmayın .
rosch

Bunun açık olmasını bekliyordum ama haklısın, cevap buna göre güncellendi.
jlliagre

@jlliagre Kodu denedim. Gnome terminalinde sorunsuz çalışır, ancak Guake'de bir problemi vardır. Herhangi bir çıktı vermez. Bunun yerine kilitlenme durumundaymış gibi donuyor. Kullanmak için Ctrl + C kullanmam gerekiyor. Gerçekten kodu anlamadı, bu yüzden nerede yanlış gittiğini bilmiyorum.
VedVals

Kod düzeltildi. Guake python tarafından çalıştırılan ve işlev çıkmak için bir hata vardı kaçırdım. Geri dönüşünüz için teşekkür ederiz.
jlliagre

Üzgünüm ahbap, hala tam olarak çalışmıyor. Hata verir bash: [: too many arguments. Eğer yardımcı olursa bash v4.2.24, python v2.7.3 var.
VedVals

10

Bunu dene:

echo $TERM

Bu daha güvenilirdir, ancak programlarınız tarafından karıştırılabilir. Ancak benimkinde, Linux Konsolu anlamına xtermgeldiğini linuxdüşünüyorum ve ttys diyor .


2
$TERMgerçek emülatörün kendisine değil, kullandığınız terminal öykünücüsü tarafından kendi kendine bildirilen belirtime karşılık gelen bir değişkendir. Örneğin, sistemimde, gerçekte lxterminal çalıştırıyor olmama rağmen echo $TERMgeri döner xterm. Olan şu ki xterm uyumu lxterminal öz raporlar. lxterminal aslında tamamen xterm uyumlu değildir, bu yüzden dikkat etmelisiniz. Spec dosyaları genellikle içinde bulunur /usr/share/terminfo.
stazher

7

Ebeveyn işlem adını açarak terminal öykünücüsü adını alabilirsiniz. Bu nedenle her terminal emülatörü ile çalışır.

Bash, zsh, vb .:

basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')

Balık kabuğu ile:

basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \  -f 4) | tail -1 | sed 's/^.* //')

Bununla birlikte, terminal emülatörü onlarla başlatıldığında bunun program argümanlarını yakalayacağını unutmayın.
Robobenklein

SSH kullanarak bağlandığımda bu işe yarar mı?
user3731622

@ user3731622 olmayacak! İstemciden iletmeniz gerekir.
Enrico

2

Birçok linux sistemi echo $TERMdönüşünde xtermyukarıdaki stazher postuna bakın.

Gerçek terminali kullanmak için şunları yapın:

1: Çalışmakta olan her terminal örneğini kapatın.

2: Her zamanki yönteminizi kullanarak yeni terminal açın.

3: Komutu aşağıdaki gibi girin:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

4: Dönüş böyle bir şey olmalı:

lxterminal --geometry=135x20

İşte arıza:

Yani: ps"işlem durumu"

ps seçeneği -oboşlukla veya belirtilen virgülle ayrılmış anahtar kelime listesiyle ilişkili bilgileri görüntüler. Kulağa karmaşık geliyor, ama gerçekten değil. (boşluk veya virgül) ayrılmış (anahtar kelime listesi) belirtildi.

Yani, (anahtar 'cmd='kelime listesi) listedeki yalnızca bir anahtar kelimedir. Yani, sadece terminal açma komutunu görüntülemek istiyoruz.

ps seçeneği -p"süreç id tarafından" Vay canına bu ps için çok güzel bir seçenektir. Sorun şu ki, ps bu işlem kimliği geçmek gerekir. Peki, süreç kimliği nasıl alınır? İfadeyi çözüyoruz $(ps -o 'ppid=' -p $$)

Burada biraz daha derin düşünmeye başlamalıyız. Keşke bu bash tek astarı icat ettim, ama yapmadım. Sanırım https://wiki.archlinux.org/ adresinden bir yerden çaldım , bir daha bulamadım. Bu adamlar harika, ama çoğu zaman çok fazla çalışmadan sonra ne yaptıklarını anlayamıyorum. Yapabileceğimiz, şimdi anlamak, çünkü açıklayacağım.

yani biliyoruz ki $bash'da genişletme operatörü. "Çözmeyi" düşünmeyi seviyorum. Böylece, $(foo -opt bar)"foo -opt bar" paketini açar veya genişletir. Ama bashta, tek yuvarlak ayraç (...)alt kabı açar.

Yani, kızı kabuğunda çalıştırmak olarak$(foo -opt bar) "foo -opt bar" genişletir . Çok garip ve anlaşılması zor.

Tamam, şimdi tekrar hemen hemen aynı komutu çalıştırıyoruz, ps -o 'ppid=' -p $$ama bu sefer ps, süreç durumu, bize kızı shell örneğinden görebildiğini gösteriyor .

-oanahtar kelime listesi, daha önce olduğu gibi sadece bir anahtar kelime, ama ppid=bu doğrudan üst kabuk işlem kimliği istiyor ! KIZI KABUK İÇİNDE! Çok zekice, değil mi? Bunu anlayabildiğim için çok heyecanlıyım!

-pyine, "süreç kimliğine göre" ve bash'da $$işlem kimliğidir.

Doğrudan ilk kabuktan ps -o 'ppid=' -p $$soran veya başka bir komut çağırırsanız , $$pid = 1 veya xWindow'dan veya masaüstü programınızdan pid diyebilir veya gerçek kabuk kabuğunu alabilirsiniz. Birçok kez sorarsanız, her seferinde farklı cevaplar alabilirsiniz!

Ancak, bir kızı çağırır ve ona "Babanın kim olduğunu" sorarsanız, size söyleyecektir! Çok zeki. Keşke bu yöntemi icat edecek kadar dahi olsaydım.


Tamam, böylece AU bir gönderi içinde doğru bozulmaya izin vermeyecektir. Üzgünüz, blog sistemiyle savaşmaya ve birden fazla gönderi yapmaya istekli değil. Belki fikir edinebilirsiniz.
stazher

Diğer cevabınız , soruya verilen bir cevaptan ziyade bu cevap hakkında sofistike ve bilgilendirici bir yorum gibi görünüyor ... İki cevabınızı bir araya getirip bunlardan birini silip eklemek için harika olur. soruyu tamamen cevaplıyor. Ortasında bir çizgi çizmek için ----? Ayrıca bir düğme var.
Zanna

Ben OP sorusuna tam olarak ve ayrıntılı olarak cevap verdiğimi düşünüyorum.Blog düzenleme sistemini anlama ve bitirme şansım olmadan önce bana atladın. Aşağı oyları getir, buna alışkınım.
stazher

1
Sana atladığımı sanmıyorum, sadece inceleme yapıyordum ... yayınınızı daha eksiksiz hale getirdiğiniz için teşekkürler
Zanna

Cevabınız için teşekkürler. Üzgünüm, belki sana atladım. Çok özür dilerim.
17'de stazher

1

pstreeVe awköğelerini kullanmak en kolay yoldur:

pstree -sA $$ | awk -F "---" '{ print $2 }'

açıklanması

  1. İle süreçlerin bir ağaç görüntüler pstreearasında $$(atual süreci).
  2. pstreeargümanlar:

    • -s: bir sürecin ebeveynlerini görüntüler
    • -A: saf ASCII'de ekran çıkışı.
  3. awkAlet bir desen tarama ve -Fbağımsız değişken işlemleri bölmek için kullanılır.

  4. Son olarak '{ print $2 }', awkyalnızca 2. eşleşme düzenini (bu durumda terminal öykünücüsü adı) vermeyi söyler .

Emin $2misin? Benim durumumda, içine boru ne awkaslında systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree...
Enrico Maria De Angelis

@EnricoMariaDeAngelis Ya. Gözleminiz için teşekkür ederim. Benim durumumda, terminal emülatörü doğrudan systemd hizmetinde başlatılır. Kodu tekrar kontrol edip bir düzeltmeyle düzenlerim.
silvadev

Öykünücüyü başlatmak için bir klavye kısayolu kullandığımda bu çalışmıyor. XFCE xfsettingsdüzerinde kullandığım terminal yerine alıyorum.
Michael Hoffmann

pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
Sondan

0

Haklısın, sadece başlık sorusu için cevap verdim, bedende soru değil. İşte buyurun ve Bob Amca.

Yukarıda gösterilen bir cevapta durum anahtarının ne hakkında olduğundan emin değilim. Böyle bir durum anahtarı gerekli değildir. ~ / .Bashrc betiğim aslında sadece basit bir satır, tüm yankı komutları sadece eğlence için. Nasıl anlatılır...

Başlarken herhangi bir terim ~ / .bashrc okur ve .bashrc içinde göreceği komutları çalıştırır. Bu nedenle, hangi terim çağrılırsa çağrılır, .bashrc'yi okuyacak ve komutları çalıştıracaktır, bu nedenle yalnızca .bashrc'de ihtiyaç duyulan yapı bir terimin veya başka bir davranışın değiştirilmesi veya hariç tutulması olacaktır. İstenen davranış her terimin aynı komutu yürütmesi içindir, bu nedenle büyük / küçük harf değişimi gerekmez. Terminal'in kendisi size nasıl çağrıldığını söyleyecektir, bu yüzden ayırt etmeye gerek yoktur.

Not (1) Guake için test yapmadım, ancak jlliagre tarafından ilk cevapta bahsedilen tüm diğerleri için çalışıyor.

Not (2) Wiki için işaretlemede biçimlendirme nedeniyle, gösterildiği gibi kesip yapıştıramazsınız. Alt çizgi karakterlerini silmek de dahil olmak üzere her bir backtick'i silmeniz psve -p $$).

~ / .bashrc için script

# show welcome message for actual terminal in use
echo "Welcome.  You are attempting to use"
echo ""
echo _backtick_ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)_backtick_
echo ""
echo "Good Luck and God Speed."

Bu çok eğlenceliydi. Bunu kendi ~ / .bashrc dosyasına ekledim.


Not (1) başına, Tilda üzerinde test ettik, iyi çalışıyor. Guake Tilda'ya benzer, ancak python ile yazılmıştır, bu yüzden hala Guake hakkında bilmiyorum.
17'de stazher

0

bash kullanıyorsanız, bu komutun size yardımcı olacağı şey:

which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))


0

ZSH kullanıyorsanız, sadece /proc/$pid/{stat,cmdline}doğrudan ZSH yerleşiklerini kullanan ve doğrudan manipüle eden daha iyi (daha hızlı) bir çözüm var .

get-terminal-emulator() {
    if [[ $TTY = "/dev/tty"* ]]; then
        echo "linux-console"
        return
    fi
    local pid=$$ name=''
    while true; do
        proc_stat=(${(@f)$(</proc/${pid}/stat)})
        name=${proc_stat[2]//[()]/}
        case "${name}" in
            gnome-terminal|konsole|rxvt|xterm)
                echo "${name}"; return ;;
            python*)
                local cmdline=(${(@f)$(</proc/${pid}/cmdline)})
                if [[ "$cmdline" =~ "\\bguake.main\\b" ]]; then
                    echo "guake"; return
                fi
                ;;
        esac
        if test "$pid" = "1" -o "$pid" = ""; then
            echo "unknown"
            return
        fi
        pid=${proc_stat[4]}       
    done
}
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.