Puncte:1

GNU make executes weird shell

drapel cn

The shell function in GNU make behaves weird on Ubuntu. Consider this simple Makefile:

TEST1 := $(shell command -v sh)
TEST2 := $(shell /bin/sh -c 'command -v sh')
all:
        $(info TEST1 = $(TEST1))
        $(info TEST2 = $(TEST2))

Running make prints

make: command: Command not found
TEST1 = 
TEST2 = /usr/bin/sh

Weird. Why does the default shell not know the command built-in? And what is the default shell invoked by GNU make actually? According to the GNU make manual:

The program used as the shell is taken from the variable SHELL. If this variable is not set in your makefile, the program /bin/sh is used as the shell.

There is no SHELL variable in the Makefile above, so the shell should be /bin/sh. However, running /bin/sh explicitly from the default shell actually behaves as expected, so there must be some difference.

So what is the real problem? It seems to be specific to GNU make packaged in Ubuntu, since the aforementioned Makefile behaves as expected on other systems like Arch Linux (which symlinks /bin/sh to bash rather than dash, though), i.e. it prints TEST1 = /usr/bin/sh.

drapel hr
Hmm... interesant. Pe baza ieșirii `strace`, se pare că nu folosește deloc un shell (în schimb trecând comanda + args direct către `execve`), fie când make variabila `SHELL` este nedefinită **sau** setată la `/bin/sh `. Se pare că este posibil să îl păcăliți să folosească `sh` pe sistemele în care /bin și /usr/bin sunt legate simbolic prin setarea `SHELL=/usr/bin/sh`.
Jakub Klinkovský avatar
drapel cn
Arch Linux conectează, de asemenea, `/bin` la `/usr/bin` și funcționează foarte bine, cu și fără `SHELL := /bin/sh`. Deci, care este diferența dintre folosirea `SHELL := /bin/sh` și `SHELL := /usr/bin/sh` pe Ubuntu?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.