Saya sering menggunakan find
atau locate
untuk mencari tahu tentang jalan.
(~) locate foobar.mmpz
/home/progo/lmms/projects/foobar.mmpz
Langkah selanjutnya adalah membuka atau memanipulasi file. Dalam kasus bahagia seperti di atas, saya bisa melakukan ini:
(~) ls `!!`
ls `locate foobar.mmpz`
/home/progo/lmms/projects/foobar.mmpz
Tapi tidak ada yang terlalu senang ketika ada banyak jalur output, beberapa di antaranya mungkin bukan jalan atau hal lain semacam itu. Selain itu, menjalankan kembali perintah yang berpotensi boros juga tidak elegan.
Apakah akan ada cara untuk menghubungkan zsh untuk menyimpan stdout ke dalam array untuk manipulasi nanti? Lagi pula, tugas shell adalah untuk mengarahkan aliran ke pengguna. Saya pikir ini bisa menyimpan N pertama dan N baris terakhir dalam variabel untuk digunakan nanti segera, seperti $?
dan lain-lain.
Ok jadi ini cukup keren: /unix//a/59704/5674 . Saya sekarang bertanya tentang zsh know-how (dan porting kode ke zsh) untuk memasang jenis penangkapan ini setelah setiap baris dijalankan.
screen
atauscript
dan kait precmd dan preexec.Jawaban:
Tidak ada fitur untuk menangkap output dari layar pada kebanyakan emulator terminal. Saya ingat penulis xterm (emulator terminal "referensi") yang menyatakan bahwa akan sulit untuk diimplementasikan. Bahkan jika itu mungkin, shell harus melacak di mana prompt terakhir berada.
Jadi Anda tidak akan luput dari menjalankan perintah lagi, kecuali jika Anda menggunakan mekanisme manual spesifik terminal seperti menyalin-paste dengan mouse di xterm atau dengan keyboard di Layar.
Akan sangat tidak praktis bagi shell untuk secara otomatis menangkap output perintah, karena shell tidak dapat membedakan antara perintah yang memiliki terminal kompleks dan interaksi pengguna dari perintah yang hanya menampilkan karakter yang dapat dicetak.
Anda dapat menjalankan kembali perintah dan menangkap hasilnya. Ada berbagai cara untuk melakukannya. Untuk menjalankan kembali perintah, Anda dapat menggunakan:
!!
substitusi sejarah - paling mudah diketik;fc -e -
, yang dapat digunakan dalam suatu fungsi.Untuk menangkap output, Anda dapat menggunakan substitusi perintah, atau fungsi seperti berikut:
Ini mengatur
lines
array ke output dari perintah yang disalurkan ke dalamnya.sumber
K
milik Anda.Inilah potongan pertama dari sesuatu untuk menempatkan baris terakhir dari output dalam variabel yang disebut
$lastline
.Ini menggunakan
preexec
kait zsh untuk dijalankanexec
dengantee
menyimpan salinan stdout perintah, kemudian menggunakanprecmd
untuk membaca output yang disimpan dan mengembalikan stdout menjadi hanya terminal untuk menampilkan prompt.Tetapi masih perlu beberapa pekerjaan. Misalnya, karena stdout bukan lagi terminal, program seperti
vim
danless
tidak berfungsi dengan baik.Ada beberapa informasi terkait yang bermanfaat dalam pertanyaan ini:
sumber
exec
panggilan dalam kode, apakah perintah berjalan beberapa kali atau saya terjebak dalam semantik khusus?exec
tanpa nama program hanya menetapkan pengalihan.Anda dapat melakukan ini hanya dengan mem-piping hasil Anda ke
tee
, yang hanya menyimpan output ke file dan menampilkannya pada saat yang sama.Jadi misalnya, Anda bisa melakukan ini, yang menunjukkan output Anda seperti biasa, tetapi juga menyimpannya ke file
/tmp/it
locate foobar.mmpz | tee /tmp/it
kemudian cat file itu dan ambil untuk memilih sesuatu, mis
cat /tmp/it | grep progo | grep lms
lalu untuk menggunakannya, Anda bisa melakukan ini:
vi $(!!)
sumber
Saya datang dengan solusi setengah matang ini:
Ini memungkinkan Anda untuk menulis
___
kapan saja di baris perintah. Perintah sebelumnya akan dijalankan kembali dan___
akan diganti dengan baris terakhir dari outputnya. Contoh penggunaan:Perintah terakhir akan diperluas ke
vim foo
.Ini memang memiliki beberapa tepi tajam!
Jika Anda memasukkan
___
dalam perintah tetapi perintah sebelumnya juga termasuk a___
, shell akan bertahan dalam keadaan aneh untuk sementara waktu. Anda dapat segera keluar dari kondisi ini dengan Ctrl- C.Anda juga tidak dapat menekan Tabuntuk memperluas
___
, seperti yang Anda bisa dengan!$
dan konstruksi lainnya.Beberapa perintah akan menampilkan output yang berbeda ketika dijalankan "normal" dan ketika mereka terpasang ke pipa. (Bandingkan output dari
ls
danls | cat
.) Jika perintah yang dipicu oleh___
salah satunya, Anda mungkin menjalankan perintah yang berbeda dari yang Anda harapkan.Dan tentu saja, jika Anda ingin melakukan sesuatu dengan jalur output selain yang terakhir, ini tidak akan membantu Anda.
Saya memilih nama
___
itu karena itu adalah sesuatu yang saya tidak pernah ingin sertakan sebagai kata dalam baris perintah, bahkan sebagai argumen. Anda dapat memilih nama yang berbeda, tetapi berhati-hatilah untuk tidak memilih sesuatu yang mungkin diperluas untuk Anda secara tidak sengaja.sumber