Terminal - salin dari CLI tanpa menggunakan mouse

20

Ketika menjalankan perintah di CLI, saya ingin menyalin perintah yang baru saja saya jalankan atau apapun yang saya tulis di terminal dan menempelkannya di tempat lain tanpa menggunakan mouse.

Seperti pada gambar berikut, saya ingin menyalin perintah pembaruan (sepenuhnya atau sebagian) tanpa menggunakan mouse dan menempelkannya di suatu tempat.

menyalin dari CLI tanpa menggunakan mouse

prayagupd
sumber
1
Anda menggunakan gnome tanpa mouse?
ott--

Jawaban:

11

Anda dapat menggunakan screen(1) dalam emulator terminal pilihan Anda ( xterm, gnome-terminal, ...).

Fungsi yang Anda butuhkan ada di dalam screen. Anda harus terbiasa dengan cara kerjanya:

  • secara default, "perintah" pengikat tombol adalah Ctrl+ A, Anda membuat perintah dengan mengeluarkan urutan "perintah" ditambah tindakan spesifik.
  • perintah "copy" adalah: AltGr+[
  • perintah "tempel" adalah AltGr+]

Anda dapat "menyalin" perintah dan "menempel" di terminal lain.

screen itu menyenangkan dan sekali Anda mulai menggunakannya Anda akan bertanya-tanya bagaimana mungkin Anda belum menggunakannya sama sekali.

dawud
sumber
Tidak ada screenperintah, jadi saya menginstalnya di gnome-terminal dan mulai screendi terminal. Tetapi setelah itu tidak bisa memulai. Saya juga tidak mengerti apa yang Anda maksud dengan layar bawaan.
prayagupd
1
Baca man screen. Juga, saya menulis 'built-in di layar', yang berarti copy / paste fungsi hadir dalam screen dengan desain .
dawud
Anda perlu menggunakan spacekunci untuk memilih area yang diinginkan. Anda perlu menggunakan Yuntuk menyalin seluruh baris atau area yang diinginkan. Layar viramah gerakan.
FelikZ
apa AltGrkuncinya? Saya punyaAlt
alhelal
1
The screenalat tidak berfungsi telah dijelaskan di sini. Dan sepertinya tidak memberikan jawaban untuk pertanyaan itu.
Luís de Sousa
7

Selain jawaban yang telah disediakan, Anda dapat mempertimbangkan untuk pindah ke emulator terminal yang lebih fleksibel.

Jika Anda siap untuk mengubah terminal menjadi rxvt-unicode , Anda bisa menggunakan alat seperti urxvt-perls : kumpulan skrip yang menyediakan fungsionalitas keyboard berikut dalam emulator terminal:

  • pilih, salin dan tempel teks
  • maju dan mundur pencarian
  • sorot dan buka URL di browser pilihan Anda

Anda cukup menginstal paket dan kemudian menambahkan beberapa baris ke Anda ~/.Xresources, dan Anda kemudian dapat mencabut tikus untuk selamanya.

jasonwryan
sumber
4

Anda dapat melakukan ini menggunakan program seperti xclip:

NAME
   xclip - command line interface to X selections (clip‐
   board)

Setelah Anda menginstalnya, Anda dapat menggunakannya untuk terhubung ke papan klip X Anda. Sayangnya, ini tidak akan berfungsi di mysqllingkungan Anda (ia memiliki buffer sendiri untuk jalur yang disalin) tetapi akan jika Anda ingin menjalankan perintah 'normal'. Sebagai contoh :

$ This is a long command line

Ketik CtrlAuntuk pergi ke awal baris, lampirkan perintah dalam tanda kutip lalu gema:

$ echo -e "This is a long command line" |xclip 

Anda sekarang memiliki "Ini adalah baris perintah yang panjang" di clipboard klik tengah Anda.

Jika Anda ingin menempel tanpa menggunakan mouse, itu akan tergantung pada tempat Anda menempelkan. Anda dapat menempelkan ke terminal lain dengan menjalankan:

$ xclip -o

Anda dapat menempel ke terminal yang sama, cukup dengan membunuh (memotong) perintah dengan CtrlKdan lalu menempel CtrlY.

Anda juga dapat menyimpan perintah di terminal menggunakan riwayat bash. Tambahkan baris ini ke ~/.bashrc:

PROMPT_COMMAND='history -a; history -r'

PROMPT_COMMANDadalah variabel bash khusus. Jika disetel, nilai dieksekusi sebagai perintah sebelum mengeluarkan prompt baru. history -aakan menulis riwayat sesi saat ini ke file riwayat dan history -rakan memuat kembali file itu. Ini berarti bahwa setiap perintah yang Anda jalankan akan segera ditulis ke file histori.

Sekarang ketika Anda menjalankan baris perintah yang panjang, Anda dapat beralih ke terminal lain dan tekan kembali (hanya untuk menjalankan $PROMT_COMMAND, sebagai alternatif, buka jendela terminal baru) dan itu akan dapat diakses oleh sejarah terminal ini. Jika Anda menekan sekarang UpAnda dapat menjalankannya di terminal baru.

terdon
sumber
Tidak apa-apa, tapi saya masih harus menggunakan mouse?
prayagupd
@PrayagUpd ah, ya, itu akan menyalin ke buffer klik tengah. Lihat jawaban yang diperbarui untuk cara lain.
terdon
Saya pikir $ xclip -obukan apa yang saya inginkan karena hanya mencetak apa yang saya xcliped. Tapi +1 untuk Ctrl+Adiikuti oleh Ctrl+Kdan Ctrl+Yuntuk memotong dan menempel ke setidaknya di terminal yang sama.
prayagupd
@PrayagUpd masalahnya adalah ada berbagai buffer clipboard yang sedang dimainkan dan solusinya akan tergantung pada apa yang ingin Anda lakukan. Bisakah Anda memperbarui pertanyaan Anda dengan contoh spesifik tentang apa yang Anda butuhkan? Maksud saya menyalin dari mana (mysql akan rumit) dan ke mana.
terdon
1
@PrayagUpd melihat jawaban yang diperbarui untuk trik lain.
terdon
1

@evilsoup telah menyarankan solusi yang baik tetapi sering rusak.

Solusi Cepat

Berikut ini solusi yang tidak pernah putus .

history | tail -2 | head -1 | xclip -selection clipboard

Jalankan saja perintah ini dan itu akan menyalin perintah yang baru saja Anda jalankan ke clipboard.

Pada dasarnya, apa yang dilakukannya adalah mencetak riwayat perintah Anda dan mengambil perintah terakhir kedua dan mengumpankannya ke clipboard Anda (perintah terakhir adalah ini sendiri, sehingga ia memilih perintah terakhir kedua).

Fungsi Kustom

Berkembang pada solusi cepat, berikut adalah fungsi kecil yang saya tulis yang cukup cerdas dan akan menyalin perintah yang terakhir digunakan. Anda juga dapat memberikan argumen numerik untuk menyalin perintah terakhir. Misalnya untuk menyalin perintah terakhir kedua berikan 2sebagai argumen

myclipcopy () {

  if [ -z $1 ]
    then  # if no argument was provided then just copy the last used command
    history | tail -2 | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo 'Anyways, the following command has been copied:'
    history | tail -2 | head -1| sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'

  else
    myindex=$(( $1+1 ))
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g' | xclip -selection clipboard
    echo "The following command has been copied:"
    history | tail -$myindex | head -1 | sed -re 's/[[:space:]]+[[:digit:]]+[[:space:]]+//g'
  fi

  #Delete this command itself from the history
  myhisnum=$(history | tail -1 | grep -oP '\s\d+\s' | grep -oP '\d+'); history -d $myhisnum
}

Salin-tempel fungsi di atas dalam ~/.bashrcfile Anda . Perhatikan bahwa jika Anda meletakkan ini dalam file skrip bash yang terpisah, dan menjalankan skrip, itu tidak akan berfungsi karena perintah sejarah tidak akan dapat mengakses riwayat Anda dalam kasus itu.

Akhirnya, jalankan sebagai:

myclipcopy 3
# This copies the third-last command

Selain itu, satu fitur keren yang ditambahkan ke fungsi ini adalah ia menghapus dirinya sendiri dari histori setelah dijalankan. Ini membantu karena indeks "mundur" dari perintah tidak berubah.

shivams
sumber
Ini tidak kuat .
mikeserv
@ mikeserv: Saya telah mengganti namanya sekarang menjadi "Fungsi Kustom". Tetapi mengapa Anda menurunkannya? Tidakkah Anda memperhatikan bahwa ini menjawab pertanyaan dengan benar? Selain itu, mengapa saya mengatakan "kuat" adalah karena sebenarnya tidak boleh rusak. Dengan downvoting, Anda hanya menyembunyikan jawaban yang sesuai dari pos.
shivams
Saya downvoted karena Anda menganggap banyak : terutama bash dan linux, yang tidak ditentukan dalam pertanyaan. Juga, saluran pipa Anda terlalu rumit, dan hal yang sama berlaku untuk regex Anda
mikeserv
@ mikeserv: Terima kasih atas komentarnya. Semoga ini akan membantu saya menghasilkan jawaban yang lebih baik. Saya akan menerima bahwa regex dan jaringan pipa saya jelek. Tapi mereka diuji dengan baik dan saya telah menggunakannya. Dan untuk asumsi, apakah Anda memperhatikan bahwa jawaban dengan nilai tertinggi telah mengambil asumsi yang digunakan pengguna screen. Jawaban berperingkat tertinggi kedua juga diasumsikan bashdan linux. Selain itu, asumsi bashbukan masalah besar karena skrip akan tetap berfungsi di zsh atau kebanyakan shell lainnya.
shivams
Saya tidak mengatakan itu jelek - saya katakan itu terlalu rumit. Dan tidak, itu tidak akan bekerja dengan baik di sebagian besar cangkang lainnya . Dan terlebih lagi, CLI sebenarnya digambarkan dalam pertanyaan adalah MySQL. Poin bagus tentang jawaban lain.
mikeserv
0

Perintah ini menggunakan ekspansi sejarah bash (jadi !!ekspansi ke baris terakhir yang Anda ketikkan ke terminal). Anda mungkin harus menginstal salah satu xclipatau xsel.

echo "!!" | xclip -selection clipboard

echo "!!" | xsel -i --clipboard

Ini akan menempatkan perintah terakhir Anda di Ctrl+ vclipboard, sehingga Anda dapat menempelkan ke dalam program GUI apa pun (atau dengan Ctrl+ Shift+ vdi sebagian besar emulator terminal, atau dengan "+pvim).

Ini akan dipecah untuk beberapa baris yang berisi tanda kutip ganda, misalnya:

$ echo "foo;bar"
foo;bar
$ echo "!!"
echo "echo "foo;bar""
echo foo
The program 'bar' is currently not installed. You can install it by typing:
sudo apt-get install bar

Ini akan bekerja untuk perintah yang Anda berikan sebagai contoh; Anda seharusnya hanya memiliki masalah jika tanda kutip ganda lolos ; & && | ||dan seterusnya.

Evilsoup
sumber
Terima kasih atas jawaban ini, ini adalah solusi paling praktis yang bisa saya segera terapkan. Dan saya percaya masalah dengan "dapat dihindari hanya dengan tidak mengutip !! sama sekali, lakukan saja echo !!dan itu akan bekerja dengan sempurna (kecuali dalam kasus yang tidak mungkin bahwa perintah Anda sebelumnya dimulai dengan -natau -eatau beberapa opsi lain yang echomengambil sendiri).
sundar - Reinstate Monica
0

Mungkin bukan solusi yang paling nyaman tapi saya menggunakannya dan jadi ini bisa membantu orang lain karena tidak memerlukan instalasi lunak tambahan.

  1. Anda perlu membuat file sementara di direktori yang nyaman

  2. Transfer arah atau teks yang diperlukan ke file itu. Untuk mentransfer arah, Anda dapat menggunakan

    echo $(pwd) 1> tempo
    
  3. Untuk mendapatkan arahan dari perintah penggunaan file

    cd $(tail -n 1 tempo)
    

Untuk menyalin dan menempelkan perintah, sistem ini akan bekerja dengan baik. Semoga itu bermanfaat

Dmitriy Kormulev
sumber
Kusalananda terima kasih sudah mengedit. Sekarang jawabannya terlihat jauh lebih baik
Dmitriy Kormulev