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

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.


1
@ J.Chomel Nie jestem pewien, co uważasz za błąd, nawet żartobliwie.
chepner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.