Jawaban:
Fungsi ini harus melakukan pekerjaan:
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
. Punya bash v4.2.24, python v2.7.3 jika itu membantu.
Coba ini:
echo $TERM
Ini lebih otoritatif, tetapi dapat dikacaukan oleh program Anda. Namun pada saya, katanya xterm
dan pada tyys mengatakan linux
, yang saya pikir singkatan dari Linux Console
$TERM
adalah variabel yang merujuk pada spesifikasi yang dilaporkan sendiri oleh terminal emulator yang Anda gunakan, bukan ke emulator itu sendiri. Misalnya, di sistem saya, echo $TERM
kembali xterm
meskipun saya sebenarnya menjalankan lxterminal. Apa yang terjadi adalah laporan mandiri lxterminal kepatuhan xterm. lxterminal sebenarnya tidak sepenuhnya sesuai xterm, jadi Anda harus berhati-hati. File spec biasanya terletak di /usr/share/terminfo
.
Anda bisa mendapatkan nama terminal emulator, dengan menangkap nama proses orang tua. Karena itu ia bekerja dengan setiap emulator terminal.
Dalam bash, zsh, dll .:
basename "/"$(ps -f -p $(cat /proc/$(echo $$)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //')
Dengan cangkang ikan:
basename "/"(ps -f -p (cat /proc/(echo %self)/stat | cut -d \ -f 4) | tail -1 | sed 's/^.* //')
Pada banyak sistem linux echo $TERM
kembali xterm
lihat posting lebih keras di atas.
Untuk mendapatkan terminal aktual yang digunakan, lakukan ini:
1: Tutup setiap instance terminal yang sedang berjalan.
2: Buka terminal baru menggunakan metode biasa.
3: Masukkan perintah sebagai berikut:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
4: Kembali harus seperti ini:
lxterminal --geometry=135x20
Berikut ini rinciannya:
Jadi: ps
adalah "status proses"
Opsi ps -o
adalah Menampilkan informasi yang terkait dengan spasi atau daftar kata kunci yang dipisahkan koma yang ditentukan. Kedengarannya rumit, tetapi sebenarnya tidak. (spasi atau koma) dipisahkan (daftar kata kunci) ditentukan.
Jadi, (daftar kata kunci) 'cmd='
Hanya satu kata kunci dalam daftar. Jadi, hanya meminta untuk menampilkan perintah untuk membuka terminal.
opsi ps -p
adalah "dengan proses id" Wow ini adalah opsi yang sangat bagus untuk ps. Masalahnya adalah, Anda harus meneruskan id proses ini. Jadi, bagaimana cara mendapatkan proses id? Kami membuka ekspresi $(ps -o 'ppid=' -p $$)
Di sini kita harus mulai berpikir sedikit lebih dalam. Saya berharap saya menemukan bash one-liner ini, tetapi saya tidak melakukannya. Saya rasa saya mencurinya dari https://wiki.archlinux.org/ di suatu tempat, saya tidak dapat menemukannya lagi. Orang-orang itu luar biasa, tetapi sering kali saya tidak mengerti apa yang mereka katakan sampai setelah banyak belajar. Yang bisa kita lakukan adalah memahaminya sekarang, karena saya akan jelaskan.
jadi kami tahu $
adalah operator ekspansi di bash. Saya suka berpikir "un-wrap". Jadi, $(foo -opt bar)
akan membuka, atau memperluas, "foo -opt bar". Tetapi dalam bash, penjepit putaran tunggal (...)
membuka subkulit.
Jadi, $(foo -opt bar)
perluas "foo -opt bar" seperti dijalankan di shell putri . Sangat aneh dan sulit dimengerti.
OK, jadi sekarang kita menjalankan perintah yang hampir sama lagi, ps -o 'ppid=' -p $$
tetapi kali ini ps, status proses, menunjukkan kepada kita apa yang bisa dia lihat dari dalam instance shell putri .
-o
daftar kata kunci, hanya satu kata kunci seperti sebelumnya, tetapi ppid=
ini meminta langsung untuk proses id shell induk !! Dari DALAM DALAM SHELL! Sangat pintar, ya? Saya sangat senang ketika saya bisa memahami ini!
-p
lagi, "dengan id proses" dan dalam bash $$
adalah id proses.
Jika Anda menelepon ps -o 'ppid=' -p $$
, atau perintah lain yang meminta $$
langsung dari shell pertama, ia mungkin mengatakan pid = 1, atau pid dari xWindow, atau dari program desktop Anda, atau Anda mungkin mendapatkan pid shell yang sebenarnya. Jika Anda bertanya berkali-kali, Anda mungkin mendapatkan jawaban yang berbeda setiap kali!
Tapi, jika Anda memohon seorang anak perempuan dan tanyakan padanya "Siapa Ayahmu" dia akan memberi tahu Anda! Sangat pintar. Saya berharap saya bisa menjadi jenius untuk menciptakan metode ini.
Menggunakan pstree
dan awk
adalah cara termudah:
pstree -sA $$ | awk -F "---" '{ print $2 }'
pstree
dari $$
(proses atual).The pstree
argumen:
-s
: menampilkan orang tua dari suatu proses-A
: menampilkan output dalam ASCII murni.The awk
alat memindai pola dan -F
argumen yang digunakan untuk membagi proses.
'{ print $2 }'
disuruh awk
hanya menampilkan pola kecocokan ke-2 (dalam hal ini, nama terminal emulator).$2
? Dalam kasus saya, apa yang disalurkan ke awk
sebenarnya systemd---lightdm---lightdm---upstart---gnome-terminal----bash---pstree
...
xfsettingsd
bukan terminal yang saya gunakan.
pstree -sA $$ | head -n1 | awk -F "---" '{ print $(NF-1) }'
Anda benar, saya hanya membuat jawaban untuk pertanyaan utama, bukan pertanyaan dalam tubuh. Jadi di sini Anda pergi, dan Paman Yer Bob.
Saya tidak yakin apa itu saklar kasus, dalam satu jawaban yang ditunjukkan di atas. Sakelar kasus seperti itu tidak diperlukan. Skrip ~ / .bashrc saya sebenarnya hanya satu baris sederhana, semua perintah gema hanya untuk bersenang-senang. Bagaimana cara menjelaskan...
Istilah apa pun saat mulai membaca ~ / .bashrc, dan menjalankan perintah apa pun yang akan dilihatnya di .bashrc. Jadi, tidak peduli istilah apa yang dipanggil, ia akan membaca .bashrc dan menjalankan perintah, jadi hanya struktur yang diperlukan dalam .bashrc adalah untuk memodifikasi perilaku atau mengecualikan satu istilah atau yang lain. Perilaku yang diinginkan adalah untuk setiap istilah untuk mengeksekusi perintah yang sama, jadi case switch tidak diperlukan. Terminal sendiri akan memberi tahu Anda bagaimana ia dipanggil, sehingga tidak perlu dibedakan.
Catatan (1) Saya tidak menguji guake, tetapi bekerja untuk semua yang lain yang disebutkan dalam jawaban pertama oleh jlliagre.
Catatan (2) Karena memformat dalam penurunan harga untuk wiki, Anda tidak dapat memotong dan menempelkan seperti yang ditunjukkan. Anda harus menghapus setiap backtick , termasuk untuk menghapus karakter yang digarisbawahi, dan menambahkan backtick yang sebenarnya, tanpa spasi sebelum ps
atau setelah -p $$)
.
skrip untuk ~ / .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."
Ini sangat menyenangkan. Saya telah menambahkan ini ke ~ / .bashrc saya sendiri.
jika Anda menggunakan bash, saya kira perintah ini akan membantu Anda:
which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))
Jika Anda menggunakan ZSH, ada solusi yang lebih baik (lebih cepat), yang hanya menggunakan ZSH bawaan dan memanipulasi /proc/$pid/{stat,cmdline}
secara langsung.
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
setelah definisi.