web-dev-qa-db-fra.com

Comment vérifier quel émulateur de terminal est actuellement utilisé?

J'ai installé gnome-terminal et Guake. Je souhaite que différents messages de démarrage soient affichés sur ces émulateurs de terminal au démarrage. Quel code dois-je écrire dans .bashrc pour que cela soit réalisé?

15
VedVals

Cette fonction devrait faire le travail:

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
10
jlliagre

Essaye ça:

echo $TERM

Ceci fait plus autorité, mais pourrait être gâché par vos programmes. Cependant, sur le mien, il indique xterm et sur ttys, il indique linux, ce qui, je pense, correspond à Linux Console.

9
CMCDragonkai

Vous pouvez obtenir le nom de l'émulateur de terminal en ajoutant le nom du processus parent. Par conséquent, cela fonctionne avec chaque émulateur de terminal.

En bash, zsh, etc.:

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

Avec poisson-coquille:

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

Utiliser pstree et awk est le moyen le plus simple:

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

Expliquant

  1. Affiche une arborescence de processus avec pstree of $$ (le processus atual).
  2. Les arguments pstree:

    • -s: afficher les parents d'un processus
    • -A: afficher la sortie en ASCII pur.
  3. L'outil awk analyse un modèle et l'argument -F est utilisé pour scinder les processus.

  4. Enfin, '{ print $2 }' indique à awk de ne générer que le motif de la deuxième correspondance (dans ce cas, le nom de l'émulateur de terminal).
1
silvadev

Sur de nombreux systèmes linux echo $TERM return xterm, voir l'article stazher ci-dessus.

Pour que le terminal soit réellement utilisé, procédez comme suit:

1: Fermez chaque instance de terminal en cours d'exécution.

2: Ouvrez un nouveau terminal en utilisant votre méthode habituelle.

3: Entrez la commande comme suit:

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

4: Le retour devrait être quelque chose comme ceci:

lxterminal --geometry=135x20

Voici la ventilation:

Donc: ps est "état du processus"

l'option ps -o est Afficher les informations associées à la liste de mots-clés spécifiés, séparés par des virgules. Cela semble compliqué, mais ce n'est pas vraiment. (espace ou virgule) séparés (liste de mots-clés) spécifiés.

Donc, (liste de mots-clés) est 'cmd=' Un seul mot-clé dans la liste. Donc, il suffit de demander à afficher la commande pour ouvrir le terminal.

l'option ps -p est "by id de processus" Wow, c'est une très bonne option pour ps. Le problème est que vous devez transmettre à ps cet identifiant de processus. Alors, comment obtenir un identifiant de processus? Nous décompressons l'expression $(ps -o 'ppid=' -p $$)

Ici, nous devons commencer à penser un peu plus profondément. J'aimerais avoir inventé cette ligne unique, mais je ne l'ai pas fait. Je pense que je l'ai volé de https://wiki.archlinux.org/ quelque part, je n'ai pas pu le retrouver. Ces gars-là sont géniaux, mais souvent, je ne comprends pas ce qu’ils disent de faire après de nombreuses études. Ce que nous pouvons faire, c’est de le comprendre maintenant, parce que je vais expliquer.

nous savons donc que $ est un opérateur d’extension dans bash. J'aime penser "déballer". Donc, $(foo -opt bar) va dérouler ou développer "foo -opt bar". Mais dans bash, une accolade ronde unique (...) ouvre le sous-shell.

Donc, $(foo -opt bar) développe "foo -opt bar" comme étant exécuté dans le shell fille . Très bizarre et difficile à comprendre.

OK, donc maintenant nous exécutons à nouveau une commande presque identique, ps -o 'ppid=' -p $$, mais cette fois, ps, le statut du processus, nous montre ce qu'il peut voir depuis l'instance Shell de sa fille . .

-o liste de mots-clés, un seul mot-clé comme auparavant, mais ppid= demande directement l'identifiant du processus du Shell parent !! De dedans la coquille Shell! Très intelligent, oui? Je suis tellement excitée quand je peux comprendre cela!

-p encore, "par id de processus" et dans bash $$ est l'identifiant de processus.

Si vous appelez ps -o 'ppid=' -p $$, ou toute autre commande demandant directement $$ à partir du premier shell, il pourrait dire pid = 1, ou le pid de xWindow, ou de votre programme de bureau, ou obtenir un pid réel de Shell. Si vous demandez plusieurs fois, vous obtiendrez peut-être une réponse différente à chaque fois!

Mais si vous invoquez une fille et lui demandez "Qui est votre papa", elle vous le dira! Très intelligent. J'aimerais pouvoir être un tel génie pour inventer cette méthode.

1
stazher

si vous utilisez bash, je pense que cette commande vous aidera:

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

0
Wang Shidong

Si vous utilisiez ZSH, il existe une meilleure solution (plus rapide), qui utilise uniquement les commandes intégrées ZSH et manipule directement /proc/$pid/{stat,cmdline}.

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
}
0
André von Kugland

Vous avez raison, je n'ai fait que répondre à la question principale, pas à la question dans le corps. Alors voilà, et ton oncle de Bob.

Je ne suis pas sûr de savoir de quoi le cas a été changé, dans une des réponses ci-dessus. Une telle commutation de cas n'est pas nécessaire. Mon script ~/.bashrc n’est en réalité qu’une simple ligne, toutes les commandes echo sont juste pour le plaisir. Comment expliquer...

Tout terme au démarrage lit ~/.bashrc et exécute toutes les commandes qu’il verra dans .bashrc. Ainsi, quel que soit le terme appelé, il lira .bashrc et exécutera les commandes. Ainsi, seule la structure nécessaire dans .bashrc consisterait à modifier le comportement ou à exclure un terme ou un autre. Le comportement souhaité est que chaque terme exécute la même commande, donc la casse n'est pas nécessaire. Terminal lui-même vous dira comment il a été appelé, il n'est donc pas nécessaire de faire la différence.

Note (1) Je n'ai pas testé pour guake, mais fonctionne pour tous les autres mentionnés dans la première réponse par jlliagre.

Remarque (2) En raison de la mise en forme dans Markdown pour wiki, vous ne pouvez pas couper et coller comme indiqué. Vous devez supprimer chaque backtick, y compris pour supprimer les caractères de soulignement, et ajouter le backtick réel, sans espace avant le ps ou après le -p $$).

script pour ~/.bashrc

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

C'était très amusant. J'ai ajouté ceci à mon propre ~/.bashrc.

0
stazher