Dan jangan katakan " $TERM
" - itu selalu xterm
.
Bagaimana bash
skrip dapat mengetahui terminal apa yang sedang berjalan, khususnya apakah itu iTerm, Terminal.app, atau sebenarnya xterm?
Saya bertanya karena reset
tidak berfungsi di luar kotak pada Terminal.app dan iTerm2. Namun, iTerm2 mengenali urutan pelarian untuk melakukan reset terminal ( \x1b]50;ClearScrollback\x07
), dan jika saya bisa mendeteksinya, saya bisa menimpanya reset
dengan alias yang melakukan hal yang benar. AFAICT, Terminal.app tidak memiliki urutan reset, dan orang - orang menggunakan tom-hackery konyol untuk meretas itu .
Tujuan akhir saya di sini adalah untuk reset
bekerja sama apakah saya bekerja pada OS X atau Linux, bekerja secara lokal atau jarak jauh melalui SSH. (Saya tidak ingin harus mencoba mengingat yang mana, dan ini berguna untuk melakukan reset && command-that-outputs-a-bunch
dan memiliki pekerjaan yang masuk). Terminal.app dan iTerm melemparkan kunci pas dalam rencana ini dengan tidak menerapkan reset
dengan benar.
Ini berarti bahwa mengganti saja reset
tidak cukup: jika saya menggunakan mesin Linux, itu perlu tahu apakah saya menggunakan gnome-terminal
atau iTerm untuk mengirim urutan pelarian yang tepat.
Apakah ada cara (bahkan jika saya memerlukan ioctl
) untuk bertanya terminal apa itu sebenarnya ?
¹Untuk keperluan pertanyaan ini, reset harus menghapus layar, mengatur ulang kursor, dan menghapus buffer scrollback.
sumber
Terminal.app
pengaturan, tab terminal dan mengatur garis scrollback ke 0? Apakah itu menonaktifkan sebagian dan semua teks di atas baris saat ini, atau hanya apa pun di atas layar? Saya tahu, itu bukan apa yang Anda minta, layak dicoba.reset
, karena itulah yang jari saya tahu.reset
perintah untuk menghapus konten gulir-kembali emulator terminal, tetapi itu tidak dijamin untuk melakukan itu, karena gulir-kembali adalah fitur khusus terminal emulator, bukan benar-benar sebuah bagian dari terminal. Namun, Terminal mendukung ekstensi dari urutan pelepasan ED (Erase in Display) untuk menghapus scroll-backESC [ 3 J
. Anda dapat menghapus layar, lalu menggunakannya, misalnya,reset && printf '\e[3J’
xterm
(melaluiTERM=xterm
) saya berharap Anda meniru superset dari XTerm, yang menghapus scrollback-nya saat reset. (Sama seperti jika Anda mengirim urutan pelarian untuk "biru", Anda akan mengharapkan biru.) Memang, xterm saya mengatakan kepada saya bahwaErase is backspace.
, yang saya syukuri tidak ada yang lain; itu hanya menjengkelkan.Jawaban:
Gunakan
$TERM_PROGRAM
.ITerm mengaturnya
iTerm.app
, dan Terminal.app keApple_Terminal
.sumber
sshd_config
'sAcceptEnv
mungkin. Karena ini (shell Anda berjalan pada host yang berbeda dari yang Terminal Anda jalankan) adalah informasi yang sangat penting, itu benar-benar harus menjadi bagian dari pertanyaan.$TERM
tidak ada hubungannya sama sekali dengan emulator terminal yang sedang berjalan, itu hanya terminal default Anda dan dapat diatur untuk apa saja. Untuk mendapatkan nama emulator terminal yang Anda jalankan, Anda dapat menggunakanps
untuk mendapatkan PID dari proses induk shell Anda saat ini.CATATAN: Hal berikut ini akan gagal pada OSX tetapi akan berfungsi OK di Linux
PID dari proses shell Anda saat ini adalah
$$
. Dari sana, Anda dapat menggunakanps
untuk menampilkan pohon proses, dan mencetak PID induk dari sesi shell Anda saat ini:Anda kemudian dapat meneruskan PID itu ke
ps
dan kirim untuk mencetak nama perintah:Itu akan memotong nama, itu harus cukup bagi Anda untuk mengetahuinya tetapi mungkin tidak baik untuk skrip. Untuk mendapatkan nama lengkap, Anda bisa mencoba
Inilah yang saya dapatkan di sistem saya menggunakan beberapa terminal yang berbeda:
terminator
gnome-terminal
xterm
sumber
ps: illegal option -- f
-
sebelum opsi harus bekerja sesuai dengan OSXman ps
.$2
, PPID adalah$3
), dan proses induk dari shell mungkinlogin
(tergantung pada konfigurasi Terminal), dengan params yang berbeda. Namun, yang proses induk adalahTerminal
.--no-headers
tidak ada, Anda perlu sesuatu sepertitail -n1
. Dan karena semua proses dengan UI memiliki argumen-psn_0_...
,awk '{print $NF}'
tidak berfungsi juga.Berikut cara portabel untuk mendapatkan nama atau jalur proses induk:
Hal 2:
gnome-terminal di Ubuntu:
Terminal.app:
Perhatikan bahwa jika Terminal.app diatur untuk membuka shell baru dengan shell login default, proses induk shell adalah
login
dan bukan terminal.The
comm
kolom path lengkap dari perintah di OS X dan nama perintah dipotong ke 15 karakter dalam pelaksanaan procps di Linux.sumber
login
- Apakah saya menyesuaikan profil saya beberapa waktu lalu untuk menjalankan perintahlogin -fp danielbeck
?