menempatkan perintah sejarah ke baris perintah tanpa menjalankannya

57

Saya menggunakan! N ​​di mana (n) adalah nomor baris untuk mengeksekusi baris dalam file histori yang ingin saya jalankan pada command prompt yang saya temukan melalui histori | less.

Tapi ada acara sejarah baris perintah yang ingin saya ubah secara manual. Bagaimana saya bisa menyisipkan ke dalam baris perintah sebuah konten acara sejarah tanpa benar-benar mengeksekusi sehingga saya dapat memodifikasi dan kemudian tekan kembali?

Terbaik,

Vass
sumber

Jawaban:

71

Untuk meminta agar perintah dicetak daripada dieksekusi setelah penggantian sejarah, tambahkan :p pengubah , misalnya !42:p. Perintah yang dihasilkan juga akan dimasukkan dalam riwayat, sehingga Anda dapat menekan Upuntuk mengeditnya.

Jika Anda memiliki histverify opsi set ( shopt -s histverify), Anda akan selalu memiliki kesempatan untuk mengedit hasil dari penggantian riwayat.

The fcbuiltin memberikan akses terbatas ekspansi sejarah (ada kata designators), dan memungkinkan Anda mengedit perintah sebelumnya dalam editor eksternal.

Anda bisa menggunakan !prefixuntuk merujuk ke perintah terakhir yang dimulai dengan prefix, dan !?substringuntuk merujuk ke perintah terakhir yang dimulai dengan substring. Ketika Anda tahu apa yang Anda cari, ini bisa menghemat banyak waktu history | less.

Cara lain untuk mencari melalui riwayat sebelumnya adalah pencarian tambahan: tekan Ctrl+ Rdan mulai memasukkan substring dari apa yang Anda cari. Tekan Ctrl+ Runtuk pergi ke kemunculan string pencarian sebelumnya sejauh ini dan Ctrl+ Sjika Anda sudah terlalu jauh. Sebagian besar tombol selain Ctrl+ R, Ctrl+ S, Backspacedan karakter biasa menghentikan pencarian inkremental dan memiliki efek yang biasa (mis. Tombol panah untuk memindahkan kursor pada garis yang telah Anda capai, Enteruntuk menjalankan perintah).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ada salah ketik pada contoh pertama Anda ...
pbm
9
Anda harus melakukannya stty -ixonsebelum Ctrl-s bekerja.
Dennis Williamson
@ Dennis: Wow, emulator terminal modern tidak melakukan ini secara default? <test> Anda benar, bahkan terminal gnome di Ubuntu memiliki kontrol aliran!
Gilles 'SO- stop being evil'
Saya tidak tahu mengapa mereka masih melakukannya. Tidak mungkin menangkap sesuatu saat sedang bergulir. Pada saat Anda menekan Ctrl-s, Anda mendapatkan konfirmasi lagi. Dan koneksi serial yang lambat sebagian besar adalah sesuatu dari masa lalu.
Dennis Williamson
@ Poin Dennis tentang Ctrl-situ penting, kalau tidak salah akan macet seperti saya .
imz - Ivan Zakharyaschev
15

Satu lagi kecil: Alt+#

mengomentari baris saat ini dan memindahkannya ke buffer sejarah.

Jadi, ketika Anda sedang merakit baris perintah dan Anda perlu mengeluarkan perintah sementara untuk mis menemukan file, Anda cukup menekan Alt+ #, mengeluarkan perintah lain, naik dalam sejarah, batalkan komentar dan lanjutkan.

Rahul Patil
sumber
2
Juga Esc, #bekerja
Steven Penny
dan Anda benar-benar dapat mengetiknya di mac (tahan shift, tekan ESC dan # bersama-sama), tidak seperti combo ket lainnya (fn + alt + shift + #) ;-)
0xF2
7

Anda dapat menggunakan ruang ajaib untuk memperluas sejarah sebelum menekan enter. Di .inputrc Anda, petakan ruang ke ruang ajaib:

$if Bash
     Space: magic-space
$endif

Sekarang, setiap kali Anda mengetik spasi setelah spesifikasi riwayat, itu akan segera diperluas - berguna jika Anda ingin mengeditnya juga!

Cascabel
sumber
7

Lihatlah history-expand-lineperintah, terikat Alt+^secara default. Ini akan memperluas baris di tempat yang dapat Anda edit.

Alex Barrett
sumber
4

Menggunakan Ctrl+rAnda dapat mencari riwayat:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Perintah apa pun yang Anda temukan dapat diedit ...


Saya pikir saya menemukan apa yang Anda butuhkan: jalankan shopt -s histverifydan lain kali ketika Anda ingin menggunakan !nperintah tidak akan dieksekusi tetapi hanya dimasukkan ke baris perintah ...

pbm
sumber
Anda harus menjalankan perintah sebelum dapat dicari dengan Ctrl + r, bukan yang diminta Vass.
phunehehe
1
Saya tidak mengerti bagaimana ini tidak melakukan apa yang dia minta. Saya akan menambahkan bahwa jika Anda ingin mengedit perintah terlebih dahulu sebelum menjalankannya, Anda dapat menekan TAB setelah Anda menemukan perintah yang tepat.
Steven D
2
Jadi prosedurnya adalah, (1) Ctrl + r, (2) ketik sampai Anda menemukan perintah, (3) TAB, (4) perintah edit, (5) ENTER.
Steven D
1
@ phuenhehe: "Tapi ada acara sejarah baris perintah yang ingin saya ubah secara manual"
pbm
1
Tidak akan !n:pbekerja
alex
1

Saya sering menginginkan ini. Ketika saya menggunakan csh (dan tcsh), saya memiliki ungkapan:
!:88*:p

Idiom ini menyisipkan "kata 88 hingga kata terakhir" dari perintah sebelumnya pada titik di mana Anda mengetik pada baris perintah saat ini, yang biasanya merupakan akhir. Dalam csh, itu bukan kesalahan untuk ungkapan seperti itu untuk tidak menghasilkan kata-kata. Artinya, tidak perlu ada kata 88, tidak ada yang mengikutinya. Jika tidak ada kata 88, ini tidak menambahkan kata ke akhir perintah yang sedang diketik, dan kemudian mendorong baris perintah yang dihasilkan ke dalam sejarah tanpa eksekusi.

Seperti yang mungkin Anda ketahui,
*! (seperti !! dan! -1) adalah perintah sebelumnya;
*: 88 adalah kata 88 (kata pertama - biasanya perintah - adalah nol) dan csh akan membutuhkan kata demikian, tetapi ...
*: 88 * adalah semua kata yang dimulai dari kata 88, dan kemudian csh tidak tidak membutuhkan kata untuk ada;
*: p berarti mencetak, tetapi jangan mengeksekusi baris perintah.
Dengan atau tanpa: p, baris perintah ditambahkan ke histori perintah.

"Kenapa 88?" kamu bertanya-tanya Karena itu adalah kunci yang sama dengan * yang saya perlukan. Jika Anda memiliki perintah selama itu, mungkin!: 888 *: p adalah yang Anda butuhkan. Maaf ini tidak bekerja dengan bash AFAIK. Bash hanya akan mengatakannya bash: :88*: bad word specifier

Fakta menyenangkan: perintah Anda biasanya tidak perlu menjadi yang pertama.
> /tmp/foo echo My command is word 3
valid dalam bash dan csh.

W. Dean Stanton
sumber
Karena pertanyaan ini ditandai untuk bash, mungkin baik untuk memulai dengan mengatakan bahwa solusi Anda hanya berfungsi dalam (t) csh.
zagrimsan
0

Saya biasanya menggunakan Ctrl+ runtuk mencari dan kemudian Ctrl+ euntuk pergi ke akhir baris tanpa mengeksekusi.

nikc
sumber
sudah disebutkan
Jeff Schaller
@ JeffSchaller Saya tidak melihatnya. Saya melihat referensi CTRL + R. Tidak ada tempat saya melihat CTRL + E yang merupakan potongan puzzle yang hilang di posting di atas.
nikc