Akhir-akhir ini, saya telah bereksperimen dengan ps
perintah, dan terkadang jalur yang panjang membungkus ke baris berikutnya (atau dua) dan membuatnya sulit untuk dibaca. Saya ingin menyalurkan ps
output ke program lain untuk membatasi output ke x
jumlah karakter.
Inilah yang saya miliki sejauh ini, tetapi tidak berfungsi dengan benar:
ps aux | cut -c1-$(stty size | cut -d' ' -f2)
$(stty size | cut -d' ' -f2)
mengevaluasi ke 167, tetapi tampaknya bukan input yang valid untuk cut
.
Apakah ada cara agar sintaks jenis ini bekerja di bash?
tput rmam; ps aux
zsh
,ksh93
ataubash
menyimpan lebar terminal di$COLUMNS
Jawaban:
Karya-karya berikut:
Ini juga berfungsi:
Masalahnya adalah bahwa
stty
perlu memiliki tty pada input standar untuk berfungsi. Dua pendekatan di atas menyelesaikannya.Masih ada opsi lain. Sementara
stty
stdin dan stdout keduanya diarahkan pada perintah di atas, stderrnya tidak: ia tetap menunjuk ke terminal. Anehnya,stty
ini juga akan berfungsi jika diberikan stderr sebagai masukan:sumber
tee
ditambahkan ketika saya sedang debugging. Itu sudah pergi sekarang.<&2
berarti mendapatkan input Anda dari kesalahan standar.stty
dapatkan pengaturan terminal dibuka pada stdin-nya (Anda lakukanstty < /dev/other-tty
untuk mendapatkan pengaturan terminal lain misalnya). Jadi tidak aneh kalau itu tidak akan berfungsi jika stdinnya adalah pipa atau<&2
berfungsi.Beberapa shell suka
zsh
,bash
ataumksh
secara otomatis mengatur$COLUMNS
variabel ke lebar terminal, jadi Anda tidak perlu meminta distty
sini.Semua implementasi
ps
I mencoba yang mendukung sintaksis non-standar (tipe BSD) menanyakan lebar terminal sendiri. Saya terkejut Anda tidak. Saya berharap itu akan melihat isi dari variabelCOLUMNS
lingkungan sekalipun.Jadi Anda bisa melakukan:
Jika tidak,
Anda juga dapat memberi tahu terminal Anda untuk tidak membungkus baris:
sumber
Anda juga dapat menangani
ps
output sedikit lebih baik.Itu akan memberitahu
ps
untuk mem-parsing outputnya ke spesifikasi Anda sebagaimana diperlukan.Tentu saja, jika Anda tidak membungkus kata, maka Anda memiliki masalah info yang hilang. Apakah Anda benar-benar membutuhkan semua itu untuk semua proses? Buka di pager jika demikian:
Jika tidak, tentukan apa yang ingin Anda lihat:
Atau Anda dapat secara eksplisit menginformasikan
ps
terminal Anda--width
:The
--width
hal bekerja sama persis dengan spesifikasi Anda diminta tanpa harus melibatkan filter tambahan atau proses tambahan (yang kemungkinan hanya akan mengacaukan Anda-aux
output yang bahkan lebih). Dan$COLUMNS
seperti yang ditunjukkan di atas dan sebagaimana ditunjukkan Stephane, ia bahkan akan bekerja secara dinamis.Mungkin perlu dicatat, bahwa saya menemukan orang sering mencoba untuk menambahkan jenis filter yang tidak perlu sehingga mereka dapat mengakomodasi
|pipe
melalui filter lain untuk mengurai output yang juga sangat mungkin tidak perlu. Tentu saja, oleh orang-orang, kebanyakan saya bersungguh-sungguh .The
-o
utput operand saya sebutkan di atas memungkinkan Anda untuk filter yang kolomps
display, dan ketika Anda menambahkan=
assigment Anda bahkan dapat nama kolom sesukamu. Saya meninggalkan tugas kosong dan menyerahkannya target-p
rocess$pid
jadi satu-satunya keluaran darips
sekali adalah$pid
nama perintah dan yangargs
di doa. Dan-o
nyaris tidak menggores permukaan bagaimana Anda dapat menentukan apa yangps
akan atau tidak akan ditampilkan. Ini adalah arah yang saya sarankan Anda ambil, terutama melalui:sumber