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 + .?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top