Bagaimana menghapus output sebelumnya di Terminal di Mac OS X?

524

Saya tahu clearperintah yang 'membersihkan' layar saat ini, tetapi ia melakukan ini hanya dengan mencetak banyak baris baru - konten yang telah dihapus baru saja digulir ke atas.

Apakah ada cara untuk benar-benar menghapus semua output sebelumnya dari terminal sehingga saya tidak dapat mencapainya bahkan dengan menggulir ke atas?

Eonil
sumber
1
Apakah Anda pernah menemukan cara untuk melakukan ini yang berfungsi dalam skrip shell?
Zev Eisenberg
7
@ ZevEisenberg Saya rasa tidak. Bagaimanapun, sekarang saya pikir saya tidak membutuhkan ini sama sekali. Saya puas Command+K.
Eonil
@ZevEisenberg jawaban saya yang diperbarui (dan satu jawaban lainnya) menunjukkan kepada Anda cara melakukannya dari sebuah skrip.
Alok Singhal

Jawaban:

1101

Untuk menghapus terminal secara manual:

+K

Command+ Kuntuk keyboard yang lebih baru

Untuk menghapus terminal dari dalam skrip shell;

/usr/bin/osascript -e 'tell application "System Events" to tell process "Terminal" to keystroke "k" using command down'
Alok Singhal
sumber
@fearless_fool apple.stackexchange.com/a/31887 mungkin melakukannya? Jika ya, beri tahu saya!
Alok Singhal
Ya, tapi lihat di bawah ( stackoverflow.com/a/26615036/558639 ) untuk cara yang lebih baik sekaligus.
fearless_fool
9
Jika Anda tidak sengaja menekan ini, bagaimana cara melihat buffer yang dibersihkan?
Joshua Pinter
4
@ JoshPinter, jangan menekannya secara tidak sengaja. :) (Pertimbangkan clearuntuk menggunakan untuk semua kasus kecuali di mana Anda memerlukan riwayat scrollback untuk benar-benar menghilang, misalnya ketika Anda akan mencetak.)
Wildcard
2
@ Kartu Memori Cukup adil. :) Saran bagus untuk menggunakan clear. Saya merasa mereka harus dibalik. Mengetik clearsepertinya lebih disengaja daripada memukul Command + K.
Joshua Pinter
85

Cara yang lebih baik untuk menghapus layar dari dalam skrip ...

Jika Anda menggunakan aplikasi Terminal OSX (seperti yang dinyatakan oleh OP), pendekatan yang lebih baik (terima kasih kepada https://apple.stackexchange.com/a/113168 ) hanyalah ini:

clear && printf '\e[3J'

atau lebih ringkas (ujung hat ke https://stackoverflow.com/users/4834046/qiuyi ):

printf '\33c\e[3J'

yang menghapus buffer scrollback serta layar. Ada opsi lain juga, lihat https://apple.stackexchange.com/a/113168 untuk info lebih lanjut.

jawaban asli

Jawaban AppleScript yang diberikan di utas ini berfungsi, TETAPI memiliki efek samping yang buruk dengan membersihkan jendela terminal APAPUN yang kebetulan aktif. Ini mengejutkan jika Anda menjalankan skrip di satu jendela dan mencoba menyelesaikan pekerjaan di jendela lain!

Anda menghindari ini dengan memperbaiki AppleScript untuk hanya menghapus layar jika itu yang paling depan dengan melakukan ini (diambil dari https://apple.stackexchange.com/a/31887 ):

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

... tetapi ketika itu bukan jendela saat ini, output akan menumpuk sampai menjadi saat ini lagi, yang mungkin bukan yang Anda inginkan.

fearless_fool
sumber
1
Saya menggunakan "cara yang lebih baik" .bash_profiledan itu luar biasa karena saya kadang-kadang tidak lagi mendapatkan buffer yang salah saat membuka jendela terminal baru.
Patrick Roberts
1
Ini adalah jawaban yang paling benar secara konsep. Jawaban qiuyi menghindari && dengan mengorbankan sedikit keterbacaan. Jika jawaban Alok dapat diperluas untuk menghapus terminal yang menjalankan skrip saat ini, itu akan menjadi perbaikan, tetapi ini lebih sederhana.
Zack Morris
1
Ini waaaaaaaaaa lebih baik untuk skrip. Terima kasih banyak!
Andy
Ini sangat cocok untuk ketika Anda ssh'd ke sistem lain, terima kasih!
JBRWilkinson
48

Cara yang cantik adalah printf '\33c\e[3J'

qiuyi
sumber
3
Ini cara terbaik. Kita harus mendefinisikan alias sepertialias cls='printf "\33c\e[3J"'
mpyw
Terima kasih, inilah tepatnya yang saya butuhkan.
GigaBass
Bekerja di iTerm2 juga
Anders Zommarin
1
@ LoïcFaure-Lacroix, \33cmelakukan yang setara dengan clearperintah, yang pada dasarnya hanya menggulir layar sampai Anda tidak dapat melihat konten sebelumnya. Ini membersihkan layar, tetapi bukan buffer gulir kembali (yaitu Anda masih dapat menggunakan scroll bar untuk melihat output yang lama). Tambahkan \e[3Juntuk benar-benar menghapus buffer back scroll.
Luiss
@EirNym, tambahkan function cls { printf '\33c\e[3J\33c' }baris ~/.profile(atau seluruh sistem /etc/profile). Ini harus bekerja untuk lingkungan desktop di macOS, FreeBSD, Linux dll. Perhatikan tambahannya \33cadalah untuk menghapus \e[3Jliteral ekstra di non-macOS (pada dasarnya untuk Linux / FreeBSD, kita hanya perlu printf '\33c').
gagak vulcan
33

Letakkan ini di .bash_profile atau .bashrc Anda

function cls { 
osascript -e 'tell application "System Events" to keystroke "k" using command down' 
}
Robert Simmons Jr.
sumber
Ini seharusnya jawaban yang benar. AppleScript mungkin berantakan, tapi hei, menyelesaikan pekerjaan. Terima kasih.
allanberry
Telah dipilih, tetapi jawaban lain mencatat bahwa ini membersihkan semua jendela!
Michael Bushe
20

Pada Mac OS X Terminal fungsi ini sudah ada di dalam Aplikasi Terminal sebagai View->Clear Scrollback(Default adalah CMD+ K).

Jadi, Anda dapat menetapkan ulang ini sesuka Anda dengan pintasan Keyboard Apple. Cukup tambahkan pintasan baru untuk Terminal dengan perintah "Hapus Scrollback". (Saya menggunakan CMD+ L, karena mirip dengan CTRL+ Luntuk menghapus konten layar saat ini, tanpa menghapus buffer.)

Tidak yakin bagaimana Anda akan menggunakan ini dalam skrip (mungkin AppleScript seperti yang ditunjukkan orang lain).

Tepi laut
sumber
1
Pada Yosemite (10,10), View->Clear Scrollbacktidak ada lagi di menu Terminal. Pintasan keyboard CMD+ Kmasih berfungsi.
Nicolas Miari
1
@NicolasMiari Sepertinya Clear Scrollbackbaru saja pindah dari Viewke Editdi Yosemite.
BrainSteel
10

Dengan Mac OS X Yosemite (10.10) gunakan Option + Command + Kuntuk menghapus scrollback di Terminal.app.

David J.
sumber
9

Atau Anda dapat mengirim page break (ASCII form feed) dengan menekan:

CTRL+L

Walaupun ini secara teknis baru memulai halaman baru, ini memiliki efek bersih yang sama dengan semua metode lain, sementara menjadi jauh lebih cepat (kecuali untuk solusi Apple + K, tentu saja).

Dan karena ini adalah perintah kontrol ASCII, ia bekerja di semua shell.

pengguna2897962
sumber
1
Itu membersihkan layar tetapi membiarkan buffer scrollback tetap utuh.
George
itu tidak sama jika Anda ingin menggunakan cmd + f untuk contoh
bormat
7

Untuk menghapus hanya keluaran terakhir:

+L

Untuk menghapus terminal sepenuhnya:

+K

Aman Jain
sumber
6

Command + K akan menghapus output sebelumnya

Untuk menghapus teks yang dimasukkan, pertama-tama lompat ke kiri dengan " Command + A " lalu hapus teks di sebelah kanan pointer dengan " Control + K ".

Contoh visual: masukkan deskripsi gambar di sini

Punnerud
sumber
5
clear && printf '\e[3J'

membersihkan semuanya, bekerja dengan baik di osX juga. sangat rapi

jeevjyot singh chhabda
sumber
5

Lakukan hal yang benar, lakukan hal yang benar!

Hapus ke tanda sebelumnya:Command-L

Hapus ke bookmark sebelumnya:Option-Command-L

Hapus untuk memulai: Command-K

Bantu temanmu!

McAllister Bowman
sumber
1

Saya tidak bisa mendapatkan salah satu di atas bekerja (di macOS).

Kombinasi berhasil bagi saya -

IO.write "\e[H\e[2J\e[3J"

Ini membersihkan buffer dan layar

Michael Baldry
sumber
Apa itu IO.write? Saya harus menggantinya dengan printf agar berfungsi. Bagaimanapun, terima kasih. Yang ini paling cocok untuk saya
Fitsyu
1
Saya tidak yakin mengapa saya memilih IO.write. Ini harus bekerja sama tetapi Anda memutuskan untuk mencetak karakter-karakter ke terminal.
Michael Baldry
1

Mengetik berikut ini di terminal akan menghapus riwayat Anda (artinya menggunakan panah tidak akan memberi Anda apa-apa) - tetapi tidak akan menghapus layar:

history -c
phil
sumber
Itu benar. @ phil apakah itu menghapusnya secara permanen dari disk, atau apakah mereka masih dapat diambil?
Steven Roose
Pada dasarnya menghapus file ~ / .bash_history, jadi jika Anda dapat memulihkannya, Anda dapat memulihkan perintah yang telah dihapus
Ryan Pendleton
Tidak, itu tidak berhasil. Scrolled up history masih ada, dan saya dapat scroll up untuk melihatnya lagi.
Eonil
27
Tidak apa yang diminta. Ini membersihkan sejarah, bukan buffer saat ini, yang merupakan dua hal yang sangat berbeda.
Sean Cameron
1
Bukan apa yang diminta, dan berbahaya ; Saya baru saja digigit oleh ini, dan sejarah saya berisi hal-hal penting.
Elazar
0

Coba ini, jika Anda kewalahan dengan output jika Anda ingin filter

adb -d shell dumpsys activity | grep ActivityRecord

sreekumar
sumber
-4

CMD + K tampaknya bekerja sepanjang waktu untuk saya.

COB
sumber
2
Ini adalah jawaban yang sama dengan yang diterima yang ditulis 8 tahun yang lalu.
piksel bitworks