La variable shell $ _ ne se comporte pas comme prévu

11

Quelle est la raison pour laquelle le nombre de lignes diffère?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424
Métier à tisser
la source
1
Visitez également Paramètres spéciaux pour bash
Pandya
1
Dans un contexte interactif, !$fait ce que vous vouliez, mais cela ne fonctionnera pas dans un script IIRC.
zwol
@zwol: Oui. J'ai posé une question à ce sujet.
Loom
Vous devez utiliser la teecommande dans votre script.
Diti

Réponses:

26

$_s'étend à ./access.log(dernier argument de la dernière commande exécutée), non ./data/log.sample.

Vous voyez donc le nombre de lignes de ./access.log.

La redirection ( >) ne fait pas partie de la headcommande car elle est effectuée par le shell avant même que la headcommande ne soit lancée. Par conséquent, $_vous obtiendriez ./access.log.


De man bash:

($ _, un trait de soulignement.) Au démarrage du shell, définissez le nom de chemin absolu utilisé pour appeler le shell ou le script de shell en cours d'exécution tel que transmis dans l'environnement ou la liste d'arguments. Par la suite, se développe jusqu'au dernier argument de la commande précédente , après expansion. Définissez également le chemin d'accès complet utilisé pour appeler chaque commande exécutée et placée dans l'environnement exporté vers cette commande. Lors de la vérification du courrier, ce paramètre contient le nom du fichier courrier.

heemayl
la source
1
@ J.Chomel Je ne suis pas sûr de ce que vous pensez être un bug, même en plaisantant.
chepner