Shell
Makefile 和 .ONESHELL
何時
.ONESHELL
不使用 Makefile 在單獨的 shell 中執行每個 shell 命令。這有什麼好處?為什麼 makefile 不使用相同的外殼?
一個原因是 GNU 不會檢測到配方命令之一的失敗
make
。只有 shell 的最終退出狀態會被提供給make
. 必須另外設置.SHELLFLAGS
為-e
讓 shell 在出現錯誤時提前終止(這對於多命令 shell 呼叫是必需的,即使.ONESHELL
它們需要在第一個錯誤時失敗)。
SHELL
當是 POSIX shell時,這一切都很好。Makefile 也可以設置SHELL
為 eg/usr/bin/perl
或其他一些命令解釋器。那麼,使用.ONESHELL
.使
.ONESHELL
預設行為make
可能會破壞舊的 Makefile。儘管這不是與 POSIX 標准或 GNU 對該標準的合規性有關的問題,但 POSIX 規範的
make
基本原理對於手頭的問題有這樣的說法:make
某些高級版本的預設設置
make
是將目標的所有命令行分組並使用單個 shell 呼叫執行它們;System V 方法是將每一行單獨傳遞給單獨的外殼。單殼方法在性能上有優勢,不需要很多續行。但是,轉換為這種較新的方法會導致許多歷史 makefile 的可移植性問題,因此 POSIX makefile 的行為被指定為與 System V 的行為相同。建議使用特殊目標.ONESHELL
作為實現擴展,實現對一個或一組目標的單shell分組。GNU
make
在這方面是 POSIX 兼容的,因為它實現了 System V 行為*,並*提供了一個.ONESHELL
目標來啟用替代行為(如果需要)。make
…這是 GNU保持目前行為的另一個原因。