Jika saya membuka terminal seperti xterm
saya akan memiliki shell. Kemudian jika saya menggunakan ssh
atau zsh
saya akan memiliki "level" shell. Apakah ada cara untuk mengetahui berapa kali saya harus Ctrl+D
atau mengetik exit
untuk keluar dari semuanya? Niat saya yang sebenarnya adalah untuk keluar dari semuanya kecuali shell "root".
Akan menyenangkan mengetahui efek multiplexer terminal (seperti screen
) pada solusi.
PS: Silakan mengubah judul, saya tidak tahu apakah itu istilah yang benar.
ps: illegal option -- -
, tahu mengapa? Saya akan mengujinya lagi di Linux segera :)--option-name
sebagian besar adalah fitur khusus GNU, jadi sebagian besar tidak tersedia dalam utilitas sistem standar di luar Linux. Tetapi Anda bisa mendapatkan efekps --no-headers
portable dengan menambahkan=
setelah nama kolom. Jugacomm
kolom tidak POSIX, tapicmd
kolom (yang meliputi argumen dari perintah) adalah. Juga-p
diperlukan sebelum PID dalam sintaks POSIX. Oleh karenaps -o cmd= -p $PPID
itu portabel dan memberikan informasi serupa.comm
kolom tersebut ditentukan oleh POSIX dan didokumentasikan pada Mac OS X, sedangkancmd
kolom ada di Linux tetapi tidak standar.Anda sebenarnya telah menemukan istilah yang benar¹. Ada variabel lingkungan
SHLVL
yang semua shells interaktif utama (bash, tcsh, zsh) bertambah 1 saat mereka mulai. Jadi, jika Anda memulai shell di dalam shell,SHLVL
meningkat 1.Namun, ini tidak langsung menjawab kekhawatiran Anda, karena
SHLVL
membahas hal-hal seperti emulator terminal. Misalnya, dalam konfigurasi tipikal saya,$SHLVL
adalah 2 dalam xterm, karena level 1 sesuai dengan shell yang menjalankan sesi X saya (~/.xinitrc
atau~/.xsession
).Apa yang saya lakukan adalah untuk menampilkan
$SHLVL
prompt saya, tetapi hanya jika proses induk dari shell adalah shell lain (dengan heuristik seperti "jika namanya berakhir dengansh
tanda baca dan digit opsional, ini adalah shell"). Dengan begitu, saya memiliki indikasi visual yang jelas dalam kasus yang tidak biasa dari shell yang berjalan di bawah shell lain.Mungkin Anda lebih suka mendeteksi kerang yang berjalan langsung di bawah terminal emulator. Anda dapat melakukan ini cukup akurat: ini adalah kerang yang proses induk memiliki terminal pengontrol yang berbeda, sehingga
ps -o tty= -p$$
danps -o tty= -p$PPID
menghasilkan output yang berbeda. Anda dapat mengatur ulang secara manualSHLVL
ke 1 di shell ini, atau mengatur Anda sendiriTERMSHLVL
ke 1 di shell ini (dan ditambahkan sebaliknya).¹ Meskipun orang tidak akan berpikir itu melihat halaman manual: tidak satupun dari tiga shell yang mendukungnya termasuk kata "level" dalam dokumentasi mereka
SHLVL
.sumber
ps -o tty= -p$pid
, ini menunjukkan terminal pengontrol proses, yang mengidentifikasi emulator terminal (xterm, layar, sshd, ...) di mana proses berjalan. Proses ini tidak akan berubah jika Anda memulai shell dari shell lain, tetapi akan berubah jika Anda mulai emulator terminal baru. Jika emulator terminal adalah aplikasi Mac asli, mungkin ada kehalusan spesifik Mac yang tidak saya sadari.ps -o tty= -p$$
danps -o tty= -p$PPID
, karena Anda mengatakan mereka harus menghasilkan keluaran yang berbeda. Atau apakah saya salah mengerti sesuatu?ps -p $$ -p $PPID
(sekali lagi, saya tidak punya pengalaman OSX, jadi mungkin ada sesuatu yang tidak biasa terjadi pada OSX).ps -p $$ -p $PPID
beri (maaf saya tidak tahu bagaimana memformat komentar) PID TTY TIME CMD 209 ttys000 0: 00,01 login -pf phunehehe 210 ttys000 0: 00,12 -bashTidak terlalu elegan, tetapi Anda bisa menggunakan tampilan pohon di htop untuk melihat hubungan orangtua-anak dari shell Anda dengan proses yang berjalan lainnya.
Dan gunakan itu untuk menyimpulkan jumlah kerang yang Anda harus keluar, sebelum memulai pada "root" shell
sumber
Anda dapat menggunakan variabel lingkungan SHLVL :
sumber
ssh
eg untuk akun yang sama ini masih1
aku menemukan bahwa
bisa sangat membantu untuk melihat di mana saya "cocok" pada suatu sistem. Saya lebih suka itu
pstree -u ${USER}
.Kadang-kadang itu akan mengingatkan saya bahwa saya meninggalkan
nohup
pekerjaan berjalan, atau serupa.(Juga, saya gunakan
alias grep='grep --color=auto'
.)sumber