In Bash, ci sono alcuni operatori utili per ripetere parti dell'ultimo comando:
!^
si espande al primo argomento del comando precedente, ad es.$ echo one "two three" one two three $ echo !^ echo one one
!$
si espande all'ultimo argomento del comando precedente, ad es.$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
si espande a tutti gli argomenti del comando precedente, ad es.$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(Per quanto ho capito, si tratta di zucchero sintattico per e !!:^
, rispettivamente, dove si trova un designatore di eventi che si espande al comando precedente e , e che sono designatori di parole, consultare il Manuale di riferimento di Bash o .)!!:$
!!:*
!!
^
$
*
man bash
Questi sono spesso abbastanza utili. Ma diventa ancora più interessante con le scorciatoie da tastiera:
Quando si preme Alt+ .o Alt+ _, l'ultimo argomento del comando precedente viene inserito nel comando corrente, analogamente come se si fosse scritto
!$
a quel punto.È anche possibile premere Alt+ Ctrl+ yper inserire il primo argomento del comando precedente, come se avessi scritto
!^
a quel punto.
(Vedi la libreria GNU Readline o info readline
.)
Tendo a preferire le scorciatoie da tastiera rispetto agli operatori della cronologia di Bash, perché posso vedere cosa sto inserendo prima di eseguire effettivamente il comando. Tuttavia, non sembra esserci una scorciatoia che mi permetta di inserire tutte le parole del comando precedente, vale a dire una che fa !*
il lavoro. Almeno non sono riuscito a trovarlo.
C'è una tale scorciatoia? In caso contrario, è possibile configurare la libreria readline per aggiungerne una e come?
zsh
, se si digita echo !*
e quindi si preme TAB, si ottiene l'effetto desiderato. In generale, TAB mentre in readline espanderà tutto l'espandibile. Molto maneggevole; probabilmente bash avrà qualche configurazione con lo stesso effetto? @Seth, penso che questo sia il readline in bash, non l'emulatore di terminale - non sono sicuro però.
man bash
(da qualche parte alla linea 3030)
\e.
e \e_
sono mappati sulla funzione readline yank-last-arg
ed \e\C-y
è mappato su yank-nth-arg
. Purtroppo non sembra esserci alcun comando (singolo) che aggiunge più argomenti precedenti contemporaneamente.