Come posso spostarmi in modo efficiente nella riga di comando bash?


19

Quindi uso il upmio nella mia shell (Bash su OSX o Ubuntu, per lo più) ma qualche volta so che voglio le cose dopo la posizione corrente del cursore. C'è un modo per avere la linea su cui mi trovo completa con la linea sopra? Colpire upe quindi leftè fastidioso.

Anche qualsiasi altro trucco sarebbe bello, tranne per quello di tabcui ora parliamo :)

Ecco un esempio (per richiesta di ~ quack):

Scrivo mkdir /where/the/hell/is/that/thinge poi voglio cd nella stessa directory. Ma ora so di meta-b :)


1
un esempio esplicito sarebbe fantastico.
Quack Quixote,

@ ~ ciarlatano facendo l'esempio adesso
Dan Rosenstark,

1
ecco una domanda correlata (duplicata), con una bella risposta: superuser.com/questions/124336/…
cregox

Risposte:


11

Prova questo:

mkdir /where/the/hell/is/that/thing

quindi premere alt+.

seconda del sistema operativo e il terminale potrebbe essere necessario digitare escpoi.

Puoi anche premere alt+ 1+ .per selezionare un argomento precedente specifico.

Questo è molto meglio di !! o! $ perché puoi effettivamente vedere cosa stai per eseguire, e richiede comunque meno tasti.

edit: in senso stretto è metano alt, quindi potrebbe funzionare anche con il tasto "Windows" a seconda di come la vostra tastiera è messa a punto ..


interessante! non lo sapevo.
Quack Quixote,

2
@justin è fantastico. Su OSX meta è escape.
Dan Rosenstark,

@yar con OS X Terminal c'è anche un'impostazione delle preferenze in 'Impostazioni' -> 'Tastiera' per 'usare l'opzione come meta chiave'.
ThomasW,

Grazie @ThomasW Devo tornare a questa roba. Sono sulla riga di comando ogni giorno, ma uso pochissimi trucchi.
Dan Rosenstark,

28

Dovresti leggere man bash sul tuo sistema, in particolare la sezione su Readline , poiché questo è il meccanismo di input interattivo di bash. Il manuale di Bash su gnu.org ha una bella sezione sulla modifica della riga di comando che aiuterà a colmare alcune lacune.

Per impostazione predefinita, puoi usarli per spostarti sulla riga di comando (elencandone alcuni qui; vedi il link per un elenco completo):

  • Ctrl+ si asposta all'inizio della riga (o in Homebase alle impostazioni del terminale)
  • Ctrl+ si esposta alla fine della riga (o End...)
  • Meta+ fsposta in avanti una "parola"
  • Meta+ bsposta all'indietro una "parola"

Puoi usarli per "uccidere" (aka "tagliare") il testo da una riga:

  • Ctrl+ kuccide ("taglia") il testo dalla posizione corrente del cursore alla fine della riga
  • Ctrl+ ystrappa ("incolla") il testo ucciso più di recente nel buffer al cursore

Quindi puoi combinarli per selezionare un pezzo di qualche riga di comando che vuoi ripetere, ucciderlo, quindi incollarlo alla fine del tuo prossimo comando.


Ora, per renderlo ancora più divertente, consideriamo l' espansione della storia di bash . Questo è quello !!che la risposta di Studer menzioni . L'espansione della cronologia si suddivide in designatori di eventi , designatori di parole e modificatori .

I designatori di eventi si presentano così (di nuovo, vedere i collegamenti per l'elenco completo):

  • ! - avvia una sostituzione della cronologia
  • !n- il comando n-esimo nell'elenco della cronologia di bash, per alcuni numeri interi n (funziona anche per i negativi)
  • !!- il comando precedente; equivalente a!-1
  • !string- il comando più recente che inizia con la stringa

I designatori di parole selezionano determinate parti da un evento. Utilizzare :per separare l'evento dalla parola designatore. Le parole sono numerate da 0 a partire dall'inizio della riga e inserite nella riga corrente separate da spazi singoli.

  • $- designa l'ultimo argomento (ad es. !!:$è l'ultimo argomento dell'ultimo comando; può essere abbreviato in !$)
  • n- indica l' ennesima parola (ad es. !str:2è il secondo argomento del comando più recente che inizia con str ; !!:0è il comando dell'ultimo comando)

Quindi, per dare seguito al tuo esempio, se il tuo ultimo comando è mkdir /some/really/long/path, basta eseguire !!nuovamente il comando. Ma vuoi cdinvece entrare in quel percorso:

$ cd !$

Ora supponiamo che tu esegua alcuni altri comandi e quindi desideri fare nuovamente riferimento a quel percorso. Se quello era l'ultimo comando mkdir che hai eseguito, puoi usarlo per ripetere quel percorso:

$ tar czf ~/foo.tgz !mkdir:$

puoi anche associare questi (e altri comandi di Readline) a qualsiasi combinazione di tasti ti piaccia; vedere la sezione 8.4 del manuale, Comandi readline associabili : gnu.org/software/bash/manual/… e sezione 8.3, File Init Readline: gnu.org/software/bash/manual/bashref.html#Readline-Init-File
Quack Quixote,

grazie che aiuta davvero. Anche se "leggere il manuale" era un po 'previsto, menzionare il movimento di base dei binding aiuta. Anche solo sapere ctrl-a potrebbe essere un vero risparmio.
Dan Rosenstark,

@quack, nessun problema, ho preso una revisione successiva, in effetti :)
Dan Rosenstark,

1
nota anche bind -po bind -Pstamperà le tue combinazioni di tasti correnti; questo è il riferimento definitivo per ciò che usa la tua bash .
Quack Quixote,

1
Penso che questa risposta sia cresciuta: le cose su History Expansion sono fantastiche.
Dan Rosenstark,

6

Se sei un utente vi puoi mettere la shell in modalità vi digitando set -o vi.

È quindi possibile fare tutti i tipi di cose potenti sulla riga di comando dopo aver digitato Esc + k.

Quello che utilizzo di più è Esc+Kquindi /qualsiasi testo digitato dopo la barra verrà utilizzato per cercare nella cronologia della riga di comando.

ad es. Esc + k /smbclient darà l'ultimo comando smbclient digitato. Puoi scorrere tutte le ricerche usando i tasti vi standard ( je ksu e giù ma penso che anche le frecce su e giù funzioneranno).

Ulteriore aiuto qui , ci sono anche alcune cose bash integrate in quel link che potrebbero essere più ciò che stai cercando.

Saluti, Stu.


mentre la modalità vi è inutile per me, dal momento che non ho ancora intensificato fino a vi, l'inchiostro l è fantastico. Grazie per quello!
Dan Rosenstark,

1
L'equivalente senza modalità vi è ctrl-r. Digitalo e quindi parte di un comando precedente. Visualizzerà l'ultima occorrenza di ciò che è stato digitato. Premi nuovamente Ctrl-R per passare al successivo. Molto maneggevole.
Nerdfest,

3

È possibile utilizzare !!quale rappresenta l'ultimo comando:

% test
% eco !!
> test

interessante. Non sono sicuro di voler manipolare quella stringa usando ... cosa?
Dan Rosenstark,

questo fa parte delle strutture di storia di bash: gnu.org/software/bash/manual/… .. in particolare l'espansione della storia: gnu.org/software/bash/manual/bashref.html#History-Interaction ... note !!è un sinonimo per !-1: gnu.org/software/bash/manual/bashref.html#Event-Designators
quack quixote

2
Questo è davvero utile per quando si dimentica di usare sudo: cioè sudo !! - $ more / etc / sudoers / etc / sudoers: autorizzazione negata $ sudo !! sudo more / etc / sudoers [sudo] password per ..: # / etc / sudoers ... ... ...
user9632

@wookiebreath, grazie per questo, voterò questa risposta adesso
Dan Rosenstark,

0

Nell'esempio che usi, usa! $ Per rappresentare l'ultimo parametro del comando precedente:

mkdir / qualcosa / qualcosa

cd! $

È inoltre possibile utilizzare varianti numerate per estrarre parametri specifici di comandi precedenti.


0

Recentemente ho trovato questo cheat-readline molto utile. Molte cose che non sapevo. Usavo !$tutto il tempo fino a quando non ho scoperto Alt+ ., che ora uso sempre. :)

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.