Come ottenere rapidamente l'output di linea precedente in un terminale senza usare un mouse?


13

Terminale Linux (es. Ubuntu), c'è un metodo per ottenere l'ultima riga? Di 'che sto scrivendo casualmente un tdcomando, che non è stato installato sul mio sistema, quindi riceverò un messaggio come di seguito. Vorrei avere una "scorciatoia" per correre sudo apt-get install textdrawrapidamente.

Esiste un tale strumento o come posso copiare l'ultima riga negli appunti senza usare il mouse?

username@WorkStation:~$ td
The program 'td' is currently not installed. You can install it by typing:
sudo apt-get install textdraw
username@WorkStation:~$

Premi la freccia su? Ci hai provato? Controlla anche il comando history in Linux, che potrebbe funzionare anche per te.
Richie086,

Programmi multiplexer terminali, tmux e schermo, offrono la possibilità di inserire il testo negli appunti. Tuttavia, potrebbe esserci un modo più semplice nella GUI predefinita di Ubuntu, quindi sospetto che potrebbe essere disponibile una risposta più semplice. Premendo PgUp, Shift-PgUp o Ctrl-PgUp potrebbe consentire lo scrollback.
TOOGAM,

3
@ Richie086 Nota, ciò di cui ho bisogno sudo apt-get install textdrawnon è td. freccia su mi darà solo iltd
Daniel

Risposte:


6

Se non ti dispiace un po 'di oscenità (io no), potresti voler usare il cazzo , uno strumento che fa esattamente quello che hai chiesto.

Bene, non esattamente, ma risolve lo stesso problema. Invece di ottenere solo l'ultima riga, tenta di abbinare l'ultimo comando digitato.

Il Fuck prova a far corrispondere una regola per il comando precedente, crea un nuovo comando usando la regola corrispondente e lo esegue.

Gli esempi mostrati nel repository mostrano molti degli scenari che hai citato.

inserisci qui la descrizione dell'immagine


2

La risposta breve: no, probabilmente non hai un metodo disponibile per farlo.

La lunga risposta:

  • mentre è possibile avere un emulatore di terminale che consente di "semplicemente" rileggere i contenuti dello schermo e modificarli, in pratica ciò non viene fatto spesso a causa delle preoccupazioni che un programma indesiderato potrebbe curiosare sulle voci della tastiera.
  • una shell potrebbe essere progettata per catturare l'output dei tuoi comandi e permetterti di modificarlo (proprio come la cronologia dei tuoi comandi). Sarebbe complicato se il comando fosse qualcosa di simile vi(dove l'output non è un bel testo orientato alla linea). bash non lo fa comunque.

In pratica, ciò che le persone fanno per aggirare questa limitazione è usare altri programmi per catturare l'output del comando e modificarlo. Ma non risolverà il tuo problema immediato.

Ad esempio, utilizzo vi-like-emacs per eseguire comandi shell ad hoc. Se quelli non richiedono ulteriori input, funziona bene per eseguirli in una finestra , catturando l'output del comando e modificando l'output come necessario per perfezionare il comando. Emacs ti consente anche di fare qualcosa del genere, oltre a vim.


2

Se hai ricevuto quel messaggio in Ubuntu dopo aver eseguito un comando inesistente da bash, il tuo sistema probabilmente sta usando la command_not_found_handlefunzione. Puoi vederlo dentro /etc/bash.bashrc.

Un banale hacking può essere un'opzione: ho appena creato uno script chiamato 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

Quindi eseguire il comando td utilizzando questo script:

# ./cnfh td

Usando Ubuntu 14.04.2 LTS . Spero che aiuti.


Sembra davvero bello e forse qualcosa che vorrei aggiungere al mio sistema. Potresti aggiungere alcune informazioni su come funziona? Il codice integrato per la gestione dei completamenti e cose del genere è piuttosto difficile da capire.
Joe,

2

In tmux v2.4 e successive (poiché questo commit https://github.com/tmux/tmux/commit/76d6d3641f271be1756e41494960d96714e7ee58 ) con send-keys -X. Potrebbe essere possibile nelle versioni precedenti, con una sintassi diversa.

In .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

Ora prefix+!copierà l'ultima riga nella posizione corrente del cursore.

cursor-left può essere lasciato fuori se si desidera eseguirlo direttamente senza digitare return.

Nota : non funzionerà se l'ultima riga è vuota o se è stata spostata, ma è comunque utile nella maggior parte dei casi


1

Per eseguire l'ultima riga di output dal comando più recente, se si desidera eseguire nuovamente quel comando (poiché non ha fatto altro che emettere un messaggio di diagnostica), eseguire

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

Step by step (strato per strato):

  • fc (che potrebbe indicare "Fix Command") è un comando incorporato della shell per accedere alla cronologia dei comandi.

    • -ln
      • l(caso inferiore L) - l ist di comando precedente (s)
      • n- non includere il comando n umbers
    • 1 (uno): si riferisce al comando più recente

    fc -ln -1 elenca il comando più recente, senza includere un numero di comando.

  • $(fc -ln -1) esegue il comando più recente.
  • $(fc -ln -1) | tail -n 1esegue il comando più recente e visualizza l'ultima riga del suo output. Questa è la sudo apt-get install textdrawlinea, nel tuo esempio.
  • $($(fc -ln -1) | tail -n 1)esegue quel comando.

Puoi alias questo:

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

Vi lascio scegliere un nome più breve per l'alias.

Appunti:

  • Questo funziona solo per i comandi semplici - senza caratteri speciali come |, <, >, ;, &, o citazioni anche. Se hai bisogno di gestire comandi complessi, puoi probabilmente farlo aggiungendo un eval, ma questo non è ampiamente raccomandato.
  • Se è necessario accedere a qualcosa di diverso dall'ultima riga di output (ad es. L'ultima diciassettesima-ultima riga), è possibile eseguire una riga tail -n 17 | head -n 1.
  • Se è necessario accedere a qualcosa di diverso dal comando più recente, è possibile modificare gli argomenti in fc. Si noti che fc -ln -1è l'abbreviazione di fc -ln -1 -1. Per recuperare il terzo comando più recente, utilizzare fc -ln -3 -3.
  • Se hai bisogno di flessibilità come sopra, probabilmente dovresti scrivere una funzione shell che accetta argomenti anziché un alias.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.