Yanıtlar:
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
bash: [: too many arguments
. Eğer yardımcı olursa bash v4.2.24, python v2.7.3 var.
Bunu dene:
echo $TERM
Bu daha güvenilirdir, ancak programlarınız tarafından karıştırılabilir. Ancak benimkinde, Linux Konsolu anlamına xterm
geldiğini linux
düşünüyorum ve ttys diyor .
$TERM
gerç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 $TERM
geri 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
.
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/^.* //')
Birçok linux sistemi echo $TERM
dönüşünde xterm
yukarı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 -o
boş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 .
-o
anahtar 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!
-p
yine, "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.
pstree
Ve awk
öğelerini kullanmak en kolay yoldur:
pstree -sA $$ | awk -F "---" '{ print $2 }'
pstree
arasında $$
(atual süreci).pstree
argümanlar:
-s
: bir sürecin ebeveynlerini görüntüler-A
: saf ASCII'de ekran çıkışı.awk
Alet bir desen tarama ve -F
bağımsız değişken işlemleri bölmek için kullanılır.
'{ print $2 }'
, awk
yalnızca 2. eşleşme düzenini (bu durumda terminal öykünücüsü adı) vermeyi söyler .$2
misin? Benim durumumda, içine boru ne awk
aslında systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree
...
xfsettingsd
üzerinde kullandığım terminal yerine alıyorum.
pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
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 ps
ve -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.
bash kullanıyorsanız, bu komutun size yardımcı olacağı şey:
which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))
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
}
container
tanımdan sonra çağırmayı unutmayın .