Warum wird "$ _" nicht wie von GNU make Shell-Funktion erwartet erweitert? - Shell, Gnu-machen

Betrachten Sie den Befehl make --eval "$(error $(shell echo foo && echo $$_))" (oder äquivalentes Makefile für make-Versionen vorher3.82 wo Eval Option hinzugefügt wurde). Ich würde erwarten, dass dies "foo foo" ausgibt und dies passiert mit gmake 3.82.90 unter Cygwin, aber gmake 3.81 und 4.0 unter der Debian-Ausgabe "foo / usr / bin / make".

Versteht jemand, warum passiert das?

Natürlich, in der echten Makefile der erste Teil vonDer Shell-Befehl ist ein wenig komplizierter als ein einfaches Echo und die Idee war, das Argument nur dann auszugeben, wenn der Befehl erfolgreich war, und ihn leer zu lassen, um einen Fehler anzuzeigen. Dies erschien mir eleganter als andere Alternativen und arbeitete in ersten Tests (unter Cygwin), aber offensichtlich musste ich jetzt etwas anderes machen ...

Antworten:

3 für die Antwort № 1

Dies ist ein Shell-Problem, das kein Problem darstellt. Nicht sicher, warum ich das ursprünglich nicht gesehen habe.

Debian

$ /bin/bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
$ /bin/bash -c "echo foo && echo $_"
foo
foo
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Nov  8 08:49 /bin/sh -> dash
$ /bin/sh -c "echo foo && echo $_"
foo
/bin/sh
$ /bin/dash -c "echo foo && echo $_"
foo
/bin/dash

CentOS

$ /bin/bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
$ /bin/bash -c "echo foo && echo $_"
foo
foo
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 29 10:39 /bin/sh -> bash
$ /bin/sh -c "echo foo && echo $_"
foo
foo

Das Problem ist also, wann $_ erhält seinen Nicht-Startwert. Und es scheint, dass Dash und Bash (in Shompompatibilitätsmodus in neueren Versionen von Bash) zustimmen, dass es noch nicht gesetzt sein sollte.

Ich weiß nicht, was die Spezifikation dazu sagt.

Update: Einige schnelle Suche zeigt das an $_ ist in vielerlei Hinsicht ein Bash-ism (obwohl der Startwert etwas tragbarer zu sein scheint). $_ ist auch zufällig eine unglaublich verwirrte Variable, da sie je nach Kontext eine Reihe verschiedener Dinge tun kann.


Speisekarte