Come utilizzare argomenti dal comando precedente?
-
25-09-2019 - |
Domanda
So che Esc + . ti dà l'ultimo argomento dell'ultimo comando.
Però a me interessa il primo argomento dell'ultimo comando.C'è un'associazione di tasti per farlo?
Sulla stessa linea, c'è un modo generico di ottenere l'ennesimo argomento dall'ultimo comando?So che in uno script bash, è possibile utilizzare $0
, $1
ecc.... ma queste non funzionano sulla riga di comando.
Inoltre, cosa di scorrere il 0th argomento di comandi precedenti, come si può fare con l'ultimo argomento premendo continuamente Esc + .?
Soluzione
Proprio come M-.
(meta-punto o ESC-punto o alt-punto) è la funzione readline yank-last-arg
, M-C-y
(meta-control-y o ESC-ctrl-y o ctrl-alt-y) è la funzione readline yank-nth-arg
. Senza specificare n
, si tira il primo argomento del comando precedente.
Per specificare un argomento, premere Esc e un numero o tenere premuto ALT e premere un numero. Si può fare Alt - -. per iniziare specificando un numero negativo quindi rilasciare Alt e premere la cifra (questo conterà dalla fine della lista degli argomenti
Esempio:
Immettere il seguente comando
$ echo a b c d e f g
a b c d e f g
Ora al prossimo prompt digitare echo
(con uno spazio seguente), quindi
Premere Alt - Ctrl - y e potrai ora vedere:
$ echo a
senza premere Invio ancora, effettuare le seguenti operazioni
Premere Alt - 3 Alt - Ctrl - y
Premere Alt - - 2 Alt - Ctrl - y
Ora si vedrà:
$ echo ace
A proposito, si potrebbe avere messo il echo
sulla linea selezionando argomento 0:
Premere Alt - 0 Alt - Ctrl - y
Modifica
Per rispondere alla domanda è stato aggiunto al tuo originale:
È possibile premere Alt - 0 poi premere ripetutamente Alt -. per passo attraverso i comandi precedenti ( arg 0). Allo stesso modo Alt - - ripetendo poi Alt - ti permettono di passo attraverso il precedente prossimo per durare. argomenti.
Se non v'è alcun argomento appropriata su una particolare linea di storia, verrà suonato il campanello.
Se v'è una combinazione particolare si utilizza di frequente, è possibile definire una macro in modo un tasto eseguirà esso. Questo esempio richiamerà il secondo argomento dai comandi precedenti premendo Alt - Maiusc - Y . Si poteva scegliere qualsiasi combinazione di tasti a disposizione si preferisce invece di questo. È possibile premere ripetutamente per passo attraverso quelli precedenti.
Per provarlo, inserire la macro in un prompt di Bash:
bind '"\eY": "\e2\e."'
Per rendere più persistente, aggiungere questa riga al vostro file ~/.inputrc
:
"\eY": "\e2\e."
Purtroppo, questo non sembra funzionare per arg 0 o numeri argomento negativo.
Altri suggerimenti
!$
ottiene l'ultimo elemento del precedente argomento della riga di comando.
Per usare il primo argomento, è possibile utilizzare !^
o !:1
Esempio:
$ echo a b c d e
a b c d e
$ echo !^
echo a
a
$ echo a b c d e
a b c d e
$ echo !:1
echo a
a
Dal momento che la tua domanda è su come utilizzare altri argomenti, qui ci sono alcuni tra quelli utili:
!^ first argument
!$ last argument
!* all arguments
!:2 second argument
!:2-3 second to third arguments
!:2-$ second to last arguments
!:2* second to last arguments
!:2- second to next to last arguments
!:0 the command
!! repeat the previous line
I primi quattro forme sono più spesso utilizzati. La forma !:2-
è piuttosto intuitivo, in quanto non include l'ultimo argomento.
mi piaceva @larsmans rispondere così tanto che ho dovuto imparare di più. l'aggiunta di questo risposta a aiutare gli altri trovare la sezione pagina man e sapere cosa Google per:
$ man -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators
Word designators are used to select desired words from the event.
A : separates the event specification from the word designator.
It may be omitted if the word designator begins with a ^, $, *, -,
or %. Words are numbered from the beginning of the line, with the
first word being denoted by 0 (zero). Words are inserted into the
current line separated by single spaces.
0 (zero)
The zeroth word. For the shell, this is the command word.
n The nth word.
^ The first argument. That is, word 1.
$ The last argument.
% The word matched by the most recent ‘?string?’ search.
x-y A range of words; ‘-y’ abbreviates ‘0-y’.
* All of the words but the zeroth.
This is a synonym for ‘1-$’.
It is not an error to use * if there is just one word in
the event; the empty string is returned in that case.
x* Abbreviates x-$.
x- Abbreviates x-$ like x*, but omits the last word.
If a word designator is supplied without an event
specification, the previous command is used as the event.
! ^ Può essere il comando per il primo argomento. io non sono sicuro se c'è un modo per ottenere l'ennesima.
Si può anche ottenere gli argomenti da qualsiasi comando nella vostra storia!
$ echo a b c d e f g
a b c d e f g
$ echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
$ history | tail -5
601 echo build/libs/jenkins-utils-all-0.1.jar
602 history | tail -10
603 echo a b c d e f g
604 echo build/libs/jenkins-utils-all-0.1.jar
605 history | tail -5
$ echo !-3:4
echo d
d
$ echo !604:1
echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
In sostanza si ha un uso tirando precedente (comando) argomenti.
Per esempio, se viene emesso il seguente comando:
echo Hello, world how are you today?
quindi, Hello,
sarà il primo argomento, e today?
il sesto, che è l'ultimo;il che significa che può essere fatto riferimento, digitando:
Alt+6 seguito da Ctrl-Alt-6
Ctrl è tradizionalmente indicato come un cappello di carattere ^
anteposto le chiavi di nomi, e Alt come M-
che è Meta prefisso.
Quindi i suddetti tasti di scelta rapida possono essere ridefinito come ^My
per recuperare.
Inoltre, c'è cappelli sostituzione di scelta rapida nella riga di comando:
echo Hello, world!
^Hello^Bye
Bye, world!
per sostituire il precedente comando prima stringa, come a dire:
Hello, world! Hello, people!
^Hello^Bye
comporterebbe:
Bye, world! Hello, people!
lasciando il secondo match (hello
) invariato.
Nota:Non lasciare spazio tra i cappelli, o l'operazione non funziona.
Sopra è solo una scorciatoia per:
!:s/Hello/Bye
a livello di evento(*) sostituzione per il primo (matched) stringa nel comando precedente, mentre il prefisso prima parte con l' g
interruttore di applicare per tutta la linea globally:
echo Hello, world! Hello, people!
!:gs/Hello/Bye
Bye, world! Bye, people!
come di solito viene fatto in altri comandi come sed
, vi
, e in regex
(espressione regolare) - uno standart di ricerca (stringa di corrispondenza).
No, non è possibile fare
!:sg/Hello/Bye
o!:s/Hello/Bye/g
ecco, quello è il sintassi!
- !è per eventi;evento potrebbe essere inteso come l'output di un comando, o operazione effettuata nella cronologia dei comandi.
Che è quello che ho capito usando me stesso e cercando le cose di testa mia da quello che ho letto da varie fonti, tra le pagine di manuale, blog e forum.
Spero che possa gettare un po ' di luce in modi misteriosi di bash
, la Bourne Again shell (un gioco sh
shell, che di per sé è chiamato il Bourne shell dopo il suo inventore del cognome), che cos'è la shell di default in molte distribuzioni, tra cui server (server OS).
^ ti porterà il primo parametro, $ ti porterà l'ultimo param,:!!!. n si arriva l'elemento n-esimo
testato su Ubuntu 18.04
Per inserire precedenti argomenti:
- Alt + :. Inserto ultimo argomento da ultimo comando (ripetizione per andare indietro nella storia)
- Alt + # + :. Inserto #nth ultimo argomento da ultimo comando (ripetizione per andare indietro nella storia)
- Alt + -. , # , Alt + , zsh: Alt + - + # + : inserto #nth primo argomento da ultima. comando (ripetizione per andare indietro nella storia)
Esempio:
Ultimo comando è:
mv foo bar
- Alt + 0 + :. Inserto primo argomento dell'ultimo comando =
mv
- Alt + 2 + :. Inserto scorso 2 argomento dell'ultimo comando =
foo
- up , Ctrl + w : ultimo comando senza l'ultima parola =
mv foo
Generale scorciatoie
- Ctrl + w : rimuove ultima parola dal cursore
- Alt + d : rimuove parola successiva dal cursore
- Ctrl + k : tagli tutto dopo il cursore
- Ctrl + U , zsh: Alt + w : tagli tutto prima del cursore
- zsh: Ctrl + U : tagli l'intero comando (In bash è possibile combinare Ctrl + U , Ctrl + k )
- Ctrl + y : incollare caratteri precedentemente tagliati con Ctrl + U e Ctrl + k
- Ctrl + _ : annullare l'ultima modifica (molto utile in caso di superamento Ctrl + w )
- Ctrl + sinistra : mossa per ultima parola
- Ctrl + destro : passaggio alla parola successiva
- casa o Ctrl + a : mossa per iniziare di riga
- Fine o Ctrl + e : sposta alla fine della riga
per scorrere gli argomenti in un precedente comando
funziona solo nella zsh
corsa o aggiungere questo alla tua ~/.zshrc
autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[:" copy-earlier-word
Ora usare Alt + per andare il più indietro come si desidera, quindi usare Alt + . per Scorrere gli argomenti
Supponendo ultimo comando è
echo 1 2 3 4 5
- Alt + :.
5
- Alt + + . :
4
- Alt + + . + : :
3
- Alt + + . + : + : :
2
- Alt + + . + : + : + : :
1
- Alt + + . + : + : + : + : :
echo
fonte: https://stackoverflow.com/a/34861762/3163120
Per vedere tutte le scorciatoie disponibili
- bash:
bind -lp
- zsh:
bindkey -L
Il metodo descritto alla fine la risposta accettata funziona anche con l'argomento zeresimo per me. Ho queste righe nel mio ~/.inputrc
:
"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."
\e2\e.
ha il vantaggio rispetto \e2\e\C-y
che passa attraverso i comandi precedenti se premuto ripetutamente invece di inserire il secondo argomento del precedente comando più volte.
Per inserire l'intero comando precedente, è possibile digitare !!\e^
. \e^
è history-expand-line
.