Saya memiliki gnome-terminal dan Guake diinstal. Saya ingin memberikan pesan startup yang berbeda untuk ditampilkan pada terminal emulator ini ketika mereka mulai. Kode apa yang harus saya tulis dalam .bashrc sehingga ini tercapai?
command-line
bashrc
VedVals
sumber
sumber
container
setelah definisi.bash: [: too many arguments
. Punya bash v4.2.24, python v2.7.3 jika itu membantu.Coba ini:
Ini lebih otoritatif, tetapi dapat dikacaukan oleh program Anda. Namun pada saya, katanya
xterm
dan pada tyys mengatakanlinux
, yang saya pikir singkatan dari Linux Consolesumber
$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
kembalixterm
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 .:
Dengan cangkang ikan:
sumber
Pada banyak sistem linux
echo $TERM
kembalixterm
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, tetapippid=
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.
sumber
Menggunakan
pstree
danawk
adalah cara termudah:Menjelaskan
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 }'
disuruhawk
hanya menampilkan pola kecocokan ke-2 (dalam hal ini, nama terminal emulator).sumber
$2
? Dalam kasus saya, apa yang disalurkan keawk
sebenarnyasystemd---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
Ini sangat menyenangkan. Saya telah menambahkan ini ke ~ / .bashrc saya sendiri.
sumber
jika Anda menggunakan bash, saya kira perintah ini akan membantu Anda:
which $(ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$))
sumber
Jika Anda menggunakan ZSH, ada solusi yang lebih baik (lebih cepat), yang hanya menggunakan ZSH bawaan dan memanipulasi
/proc/$pid/{stat,cmdline}
secara langsung.sumber