Score:1

GNU make executes weird shell

ธง 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.

hr flag
อืม...น่าสนใจ จากเอาต์พุต `strace` ดูเหมือนว่าจะไม่ใช้เชลล์เลย (แทนที่จะส่งคำสั่ง + args ไปยัง `execve` โดยตรง) ไม่ว่าจะเมื่อ make ตัวแปร `SHELL` ไม่ได้กำหนด **หรือ** ตั้งค่าเป็น `/bin/sh `. ดูเหมือนว่าเป็นไปได้ที่จะหลอกให้ใช้ `sh` บนระบบที่ /bin และ /usr/bin เชื่อมโยงกันโดยการตั้งค่า `SHELL=/usr/bin/sh`
Jakub Klinkovský avatar
cn flag
Arch Linux ยังเชื่อมโยง `/bin` กับ `/usr/bin` และใช้งานได้ดีโดยมีและไม่มี `SHELL := /bin/sh` ดังนั้นอะไรคือความแตกต่างระหว่างการใช้ `SHELL := /bin/sh` และ `SHELL := /usr/bin/sh` บน Ubuntu

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา