5

Come posso ottenere facilmente la penultima parola/argomento dal comando precedente in una shell interattiva bash? Mi capita spesso di eseguire comandi in background, e mi piacerebbe ottenere il file che è stato specificato prima della &, per esempio,Come ottenere il penultimo argomento dal precedente comando bash? (in una shell bash interattiva)

% echo foo > /tmp/foo & 
    % cat !$ 
    % & 

Nell'esempio di cui sopra, !$ dà l'ultima parola, &. Ma io voglio il secondo-to-the-ultimo argomento, /tmp/foo



Si noti che è possibile utilizzare i designatori di parole con una gamma come !-1:3, ma questo è poco pratico per un comando con un gran numero di parole in cui non è subito chiaro quante parole ci sono, ad esempio,

% (set -x; date; pwd; git status; git diff; git log | tail -30; date; args=--verbose time make test; date) >& /tmp/log/make.test.20150122-Thu-0834 & 
% echo !-1:30 
/tmp/log/make.test.20150122-Thu-0834 

l'esempio precedente funziona, ma devi contare e sapere che la parola che vuoi è la parola 30, che è in termini di tempo e soggetto a errori .

C'è un modo semplice per ottenere la penultima parola (penultima)?

(Si noti che questa domanda si riferisce agli argomenti di un comando precedente in una shell interattiva, e non per argomenti passati ad uno script di shell da linea di comando, come alcune risposte e commenti qui si riferiscono a.)

+1

Correlato: [Come posso ottenere un argomento specifico da un comando precedente in bash?] (Http://superuser.com/q/210846/71161) – kojiro

+0

'$ _' fornisce l'ultimo argomento dell'ultimo comando , ma ciò significherebbe il 'pippo' di' echo pippo' dal momento che non conta i non argomenti come il reindirizzamento I/O o lo sfondo. –

+0

Eventuali duplicati di [Processo tutti gli argomenti tranne il primo] (http://stackoverflow.com/questions/9057387/process-all-arguments-except-the-first-one) –

risposta

2

utilizzare questa funzione per eseguire un comando utilizzando il 3 ° argomento dell'ultimo comando nella storia:

echo foo > /tmp/foo & 
cat !-1:3 
+0

Sì, ma non è pratico quando il comando è grande. (vedi la mia ultima modifica alla domanda con un esempio di questo) –

4

modo interattivo, è possibile ottenere il secondo per ultimo argomento della riga di comando precedente, con esc-esc. con i collegamenti predefiniti.

Più in generale, la sequenza esc. ottiene il token finale dalla linea di comando precedente, e si può passare un argomento numerico per specificare una diversa (ad esempio, escesc. ottiene il primo argomento, e escesc. ottiene il comando stesso).

esc è uno dei tasti per Meta; su molte tastiere moderne, è possibile utilizzare anche Alt come Meta (lo si preme allo stesso tempo, non come modificatore di prefisso). Preferisco lo esc come meta perché quando la memoria muscolare apprendeva queste cose, non avevamo un tasto Alt (affidabile, consistente) ed è ancora portatile fino alle tastiere VT100 e Sun; e almeno sulla mia attuale tastiera (Mac OSX Yosemite) ad es. alt - - fa qualcos'altro che specificare un argomento numerico negativo.

Da un precedente comando composto simili

echo moo; echo bar 

sequenza escesc. ottiene il punto e virgola, perché quello è il secondo token.

Sono sicuro che c'è un modo con l'espansione ! storia pure, ma di gran lunga preferisco vedere quello che sto facendo. Questo meccanismo ti porta il testo a cui vuoi fare riferimento nella riga di comando corrente, quindi puoi modificarlo se lo desideri.

+0

Anche '1' è opzionale; 'Esc-' il valore predefinito è -1. – chepner

+0

@chepner Vero, esc - esc. arriva il penultimo - grazie, TIL! – tripleee