Zmienna powłoki $ _ nie zachowuje się zgodnie z oczekiwaniami

11

Jaki jest powód różnej liczby linii?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424
Warsztat tkacki
źródło
1
Odwiedź także Specjalne parametry bash
Pandya
1
W kontekście interaktywnym !$robi to, co chciałeś, ale nie będzie działać w skrypcie IIRC.
zwolnienie
@zwol: Tak. Zadałem pytanie na ten temat.
Krosno
Powinieneś użyć teepolecenia w swoim skrypcie.
Diti

Odpowiedzi:

26

$_rozwija się do ./access.log(ostatni argument ostatnio wykonanej komendy), a nie ./data/log.sample.

Więc faktycznie widzisz liczbę linii ./access.log.

Przekierowanie ( >) nie jest częścią headpolecenia, ponieważ jest wykonywane przez powłokę jeszcze przed uruchomieniem headpolecenia. Stąd z $_tobą dostaniesz ./access.log.


Od man bash:

($ _, znak podkreślenia.) Podczas uruchamiania powłoki ustaw bezwzględną nazwę ścieżki używaną do wywoływania powłoki lub skryptu powłoki wykonywanej tak, jak przekazano w środowisku lub liście argumentów. Następnie rozwija się do ostatniego argumentu do poprzedniego polecenia , po rozwinięciu. Ustawiono również na pełną ścieżkę używaną do wywołania każdego wykonanego polecenia i umieszczonego w środowisku wyeksportowanym do tego polecenia. Podczas sprawdzania poczty ten parametr przechowuje nazwę pliku poczty.

heemayl
źródło
1
@ J.Chomel Nie jestem pewien, co uważasz za błąd, nawet żartobliwie.
chepner