Shell-Variable $ _ verhält sich nicht wie erwartet

11

Was ist der Grund, warum die Anzahl der Zeilen unterschiedlich ist?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424
Webstuhl
quelle
1
Besuchen Sie auch Special Parameters for Bash
Pandya
1
!$Macht in einem interaktiven Kontext, was Sie wollten, aber es funktioniert nicht in einem Skript IIRC.
zwol
@zwol: Ja. Ich habe eine Frage dazu gestellt.
Webstuhl
Sie sollten den teeBefehl in Ihrem Skript verwenden.
Diti

Antworten:

26

$_wird erweitert auf ./access.log(letztes Argument des zuletzt ausgeführten Befehls), nicht ./data/log.sample.

Sie sehen also tatsächlich die Anzahl der Zeilen von ./access.log.

Die Umleitung ( >) ist nicht Teil des headBefehls, da sie von der Shell ausgeführt wird, bevor der headBefehl überhaupt gestartet wird. Daher mit $_dir bekommen würde ./access.log.


Von man bash:

($ _, ein Unterstrich.) Legen Sie beim Shell-Start den absoluten Pfadnamen fest, der zum Aufrufen der Shell oder des Shell-Skripts verwendet wird, die ausgeführt werden, wie in der Umgebungs- oder Argumentliste übergeben. Anschließend dehnt sich auf das letzte Argument des vorherigen Befehls , nach der Expansion. Stellen Sie auch den vollständigen Pfadnamen ein, der zum Aufrufen jedes ausgeführten und in die in diesen Befehl exportierte Umgebung platzierten Befehls verwendet wird. Beim Überprüfen von E-Mails enthält dieser Parameter den Namen der E-Mail-Datei.

heemayl
quelle
1
@ J.Chomel Ich bin mir nicht sicher, was du für einen Fehler hältst, auch im Scherz.
Chepner