Bagaimana cara cepat mendapatkan output baris sebelumnya di terminal tanpa menggunakan mouse?

13

Terminal Linux (misalnya Ubuntu), adakah metode untuk mendapatkan baris terakhir? Katakanlah saya mengetik tdperintah secara acak , yang belum diinstal pada sistem saya, jadi saya akan mendapatkan pesan seperti di bawah ini. Saya ingin memiliki "jalan pintas" untuk berjalan sudo apt-get install textdrawcepat.

Apakah ada alat seperti itu atau bagaimana saya bisa menyalin baris terakhir ke clipboard tanpa menggunakan mouse?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$
Daniel
sumber
Tekan panah ke atas? Sudahkah Anda mencobanya? Lihat juga perintah sejarah di Linux, yang mungkin juga cocok untuk Anda.
Richie086
Program terminal multiplexer, tmux dan layar, memberikan kemampuan untuk mendapatkan teks ke clipboard. Namun, mungkin ada cara yang lebih mudah di GUI default Ubuntu, jadi saya kira jawaban yang lebih mudah mungkin tersedia. Menekan PgUp, Shift-PgUp, atau Ctrl-PgUp mungkin memungkinkan untuk scrollback.
TOOGAM
3
@ Richie086 Harap dicatat, yang saya butuhkan adalah sudo apt-get install textdraw, bukan td. panah atas hanya akan memberi sayatd
Daniel

Jawaban:

6

Jika Anda tidak keberatan sedikit kecabulan (saya tidak), Anda mungkin ingin menggunakan fuck , alat yang melakukan persis apa yang Anda minta.

Ya, tidak persis seperti itu, tetapi itu memecahkan masalah yang sama. Alih-alih hanya mendapatkan baris terbaru, ia mencoba untuk mencocokkan perintah terakhir yang Anda ketikkan.

Persetan mencoba untuk mencocokkan aturan untuk perintah sebelumnya, membuat perintah baru menggunakan aturan yang cocok dan menjalankannya.

Contoh-contoh yang ditunjukkan di repositori menunjukkan beberapa skenario yang Anda sebutkan.

masukkan deskripsi gambar di sini

Alfa
sumber
2

Jawaban singkatnya: tidak, mungkin Anda tidak memiliki metode yang tersedia untuk melakukan ini.

Jawaban panjangnya:

  • sementara dimungkinkan untuk memiliki terminal emulator yang memungkinkan Anda untuk "hanya" membaca kembali isi layar dan mengeditnya, dalam praktiknya hal itu tidak sering dilakukan karena kekhawatiran bahwa beberapa program yang tidak diinginkan dapat mengintip entri keyboard Anda.
  • sebuah shell dapat dirancang untuk menangkap output dari perintah Anda dan memungkinkan Anda untuk mengeditnya (seperti riwayat perintah Anda). Ini akan menjadi rumit jika perintahnya adalah sesuatu vi(di mana outputnya tidak bagus dengan teks berorientasi garis). Namun, bash tidak melakukan itu.

Dalam praktiknya, apa yang dilakukan orang untuk mengatasi keterbatasan ini adalah menggunakan program lain untuk menangkap output perintah, dan mengeditnya. Tapi itu tidak akan menyelesaikan masalah langsung Anda.

Sebagai contoh, saya menggunakan vi-like-emacs untuk mengeluarkan perintah ad hoc shell. Jika itu tidak memerlukan input lebih lanjut, itu berfungsi dengan baik untuk menjalankan mereka di jendela , menangkap output dari perintah - dan mengedit output sesuai kebutuhan untuk memperbaiki perintah. Emacs juga memungkinkan Anda untuk melakukan sesuatu seperti itu, dan juga vim.

Thomas Dickey
sumber
2

Jika Anda mendapatkan pesan itu di ubuntu setelah menjalankan perintah yang tidak ada dari bash, sistem Anda mungkin menggunakan command_not_found_handlefungsi. Anda bisa melihatnya di /etc/bash.bashrc.

Peretasan sepele mungkin merupakan opsi: Saya baru saja membuat skrip bernama cnfh:

#!/bin/bash

# if the command-not-found package is installed, use it
if [ -x /usr/lib/command-not-found -o -x /usr/share/command-not-found/command-not-found ]; then
        function command_not_found_handle {
                # check because c-n-f could've been removed in the meantime
                if [ -x /usr/lib/command-not-found ]; then
                   /usr/lib/command-not-found -- "$1"
                   return $?
                elif [ -x /usr/share/command-not-found/command-not-found ]; then
                   /usr/share/command-not-found/command-not-found -- "$1"
                   return $?
                else
                   printf "%s: command not found\n" "$1" >&2
                   return 127
                fi
        }
fi


"$@"
RET_VAL=$?
if [ $RET_VAL -eq 127 ]; then
  OUT=$(command_not_found_handle "$@" 2>&1)
  $(echo $OUT |sed -n 's/.*\(apt-get install .\+\)$/\1/p')
fi

Kemudian jalankan perintah td menggunakan skrip ini:

# ./cnfh td

Menggunakan Ubuntu 14.04.2 LTS . Saya harap itu membantu.

Kadir
sumber
Ini terlihat sangat keren dan mungkin sesuatu yang ingin saya tambahkan ke sistem saya. Bisakah Anda menambahkan beberapa informasi tentang cara kerjanya? Kode bawaan untuk menangani penyelesaian dan hal-hal seperti ini cukup sulit untuk dipahami.
Joe
2

Dalam tmux v2.4 dan seterusnya (karena ini melakukan https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 ) dengan send-keys -X. Mungkin di versi yang lebih lama, dengan sintaks yang berbeda.

Dalam .tmux.conf:

bind ! copy-mode \;\
       send-keys -X cursor-up \;\
       send-keys -X select-line \;\
       send-keys -X cursor-left \;\
       send-keys -X copy-selection-and-cancel \;\
       paste-buffer

Sekarang, prefix+! akan menyalin baris terakhir di posisi kursor saat ini.

cursor-left dapat ditinggalkan jika Anda ingin menjalankannya secara langsung tanpa mengetikkan return.

Catatan : ini tidak akan berfungsi jika baris terakhir kosong atau jika dibungkus tetapi masih bermanfaat dalam kebanyakan kasus

lbonn
sumber
1

Untuk mengeksekusi baris keluaran terakhir dari perintah terbaru, jika Anda bersedia untuk mengeksekusi kembali perintah itu (karena tidak melakukan apa-apa kecuali mengeluarkan pesan diagnostik), lakukan

$($(fc -ln -1) | tail -n 1)

Langkah demi langkah (lapis demi lapis):

  • fc (yang mungkin merupakan singkatan dari "Fix Command") adalah perintah builtin shell untuk mengakses riwayat perintah.

    • -ln
      • l(huruf kecil L) - l ist perintah sebelumnya
      • n- tidak termasuk perintah n umbers
    • 1 (satu) - mengacu pada perintah terbaru

    fc -ln -1 daftar perintah terbaru, tidak termasuk nomor perintah.

  • $(fc -ln -1) mengeksekusi perintah terbaru.
  • $(fc -ln -1) | tail -n 1mengeksekusi perintah terbaru dan menampilkan baris terakhir dari outputnya. Ini adalahsudo apt-get install textdraw garis, dalam contoh Anda.
  • $($(fc -ln -1) | tail -n 1)mengeksekusi itu perintah.

Anda dapat alias ini:

alias execute_last_line_of_output_from_previous_command='$($(fc -ln -1) | tail -n 1)'

Saya serahkan kepada Anda untuk memilih nama yang lebih pendek untuk alias.

Catatan:

  • Ini bekerja hanya untuk perintah sederhana - ada karakter khusus seperti |, <, >, ;, &, atau bahkan kutipan. Jika Anda perlu menangani perintah yang rumit, Anda mungkin dapat melakukannya dengan menambahkaneval , tetapi ini secara luas tidak disarankan.
  • Jika Anda perlu mengakses sesuatu selain dari baris keluaran terakhir (mis., Baris terakhir yang ketujuh belas sampai terakhir), Anda dapat melakukan sesuatu baris tail -n 17 | head -n 1 .
  • Jika Anda perlu mengakses sesuatu selain dari perintah terbaru, Anda dapat mengubah argumen menjadi fc. Perhatikan bahwa fc -ln -1kependekan dari fc -ln -1 -1. Untuk mengambil perintah terbaru ketiga, gunakan fc -ln -3 -3.
  • Jika Anda membutuhkan fleksibilitas seperti di atas, Anda mungkin harus menulis fungsi shell yang mengambil argumen daripada alias.
G-Man Mengatakan 'Reinstate Monica'
sumber