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é?
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
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.
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/^.* //')
Utiliser pstree
et awk
est le moyen le plus simple:
pstree -sA $$ | awk -F "---" '{ print $2 }'
pstree
of $$
(le processus atual).Les arguments pstree
:
-s
: afficher les parents d'un processus-A
: afficher la sortie en ASCII pur.L'outil awk
analyse un modèle et l'argument -F
est utilisé pour scinder les processus.
'{ 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).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.
si vous utilisez bash, je pense que cette commande vous aidera:
which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))
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
}
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.