La variabile di shell $ _ non si comporta come previsto


11

Qual è il motivo per cui il numero di righe differisce?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424

1
Visita anche Parametri speciali per bash
Pandya,

1
In un contesto interattivo, !$fa quello che volevi, ma non funzionerà in uno script IIRC.
zwol,

@zwol: Sì. Ho fatto una domanda al riguardo.
Telaio

Dovresti usare il teecomando nel tuo script.
Diti,

Risposte:


26

$_si sta espandendo in ./access.log(ultimo argomento dell'ultimo comando eseguito), no ./data/log.sample.

Quindi stai effettivamente vedendo il numero di righe di ./access.log.

Il reindirizzamento ( >) non fa parte del headcomando poiché viene eseguito dalla shell prima ancora che il headcomando venga avviato. Quindi con $_te otterresti ./access.log.


Da man bash:

($ _, trattino di sottolineatura). All'avvio della shell, impostare sul percorso assoluto usato per invocare la shell o lo script della shell in esecuzione come passato nell'ambiente o nell'elenco degli argomenti. Successivamente, si espande all'ultimo argomento al comando precedente , dopo l'espansione. Impostato anche sul percorso completo utilizzato per richiamare ciascun comando eseguito e inserito nell'ambiente esportato in quel comando. Quando si controlla la posta, questo parametro contiene il nome del file di posta.


1
@ J.Chomel Non sono sicuro di quello che pensi sia un bug, anche scherzando.
Chepner,
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.