Come posso ottenere un argomento specifico da un comando precedente in bash?


31

In bash, puoi usare !*per ottenere tutti gli argomenti dal comando precedente. Ad esempio, se lo facessi cp /some/path /some/other/pathe lo facessi mv !*, il secondo comando verrebbe espanso in mv /some/path /some/other/path.

Esiste qualcosa di simile che può essere utilizzato per accedere a un argomento specifico da un comando anziché da tutti?

Risposte:


38

In !*, !è l' espansione della cronologia prefisso, ed *è il designatore di parola Ciò significa che tutti gli argomenti. È possibile memorizzare la sintassi generale come bang-line-colon-column ( colonna !line :). Esistono molte scorciatoie possibili: la riga predefinita è la riga precedente, l'identificatore di colonna predefinito è "all" e puoi lasciare i due punti se l'identificatore di colonna non è numerico (ma !3significherebbe la riga 3). È possibile utilizzare !:0per fare riferimento al nome del comando, !:1, !:2, ecc, per fare riferimento ad argomenti successivi, !:$per l'ultima parola, !:*per tutti gli argomenti, e altro ancora.

Vedi anche questo post di Michael Mrozek presso Unix Stack Exchange .


1
L'ho provato da solo e questo non ha funzionato, comunque. Dopo aver guardato il post di Michale Mrozek, dice di utilizzo !:1, !:2. Dopo aver usato la versione con i due punti, ha funzionato.
Wuffers,

@MrMan: Oops, giusto, se lasci i due punti con un numero, il numero viene interpretato come un numero di riga. Mi dispiace per quello.
Gilles 'SO- smetti di essere malvagio' il

Nessun problema. Quindi, suppongo che fare !1:1indichi il primo argomento della prima riga?
Wuffers,

4

Personalmente, non mi piace molto questa funzione di "espansione con punto esclamativo" che disturberà anche se provi echo "Hello World!"in shell interattive (quindi gli script di sourcing che presumono che verranno eseguiti in modalità non interattiva non funzioneranno affatto).

Quindi, ho impostato set +o histexpande inizio a ricordare argomenti con il seguente metodo:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

Nota che l'Esc-trick è perché non ho una meta chiave.


Non uso quasi mai punti esclamativi nei comandi. Quindi il metodo del punto esclamativo funziona perfettamente per me.
Wuffers,

Allora divertiti. Molte delle numerose funzionalità della shell sono progettate solo per pochi utenti.
Benoit,

In realtà, non è necessario sfuggire ai punti esclamativi. Fare echo 'Hello, orld!'. Nota le virgolette singole anziché quelle doppie.
Wuffers,
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.