La variable de shell $ _ no se comporta como se esperaba

11

¿Cuál es la razón por la cual el número de líneas difiere?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424
Telar
fuente
1
También visite Parámetros especiales para bash
Pandya
1
En un contexto interactivo, !$hace lo que quería, pero no funcionará en un script IIRC.
zwol
@zwol: Sí Hice una pregunta al respecto.
Telar
Deberías usar el teecomando en tu script.
Diti

Respuestas:

26

$_se está expandiendo a ./access.log(último argumento del último comando ejecutado), no ./data/log.sample.

Entonces, en realidad estás viendo la cantidad de líneas de ./access.log.

El redireccionamiento ( >) no es parte del headcomando, ya que lo hace el shell antes de que el headcomando se inicie. Por lo tanto con $_usted obtendría ./access.log.


De man bash:

($ _, un guión bajo). Al iniciar el shell, establezca el nombre de ruta absoluto utilizado para invocar el shell o el script de shell que se ejecuta como se pasa en el entorno o la lista de argumentos. Posteriormente, se expande hasta el último argumento del comando anterior , después de la expansión. Establezca también el nombre de ruta completo utilizado para invocar cada comando ejecutado y colocado en el entorno exportado a ese comando. Al verificar el correo, este parámetro contiene el nombre del archivo de correo.

heemayl
fuente
1
@ J.Chomel No estoy seguro de qué crees que es un error, incluso en broma.
chepner