帶有來源命令的 Makefile 不起作用

帶有來源命令的 Makefile 不起作用

我有以下 Makefile

env:
    source venv/bin/activate

當我make env啟動 python 虛擬環境時,出現以下錯誤

source venv/bin/activate make: source: 沒有這樣的檔案或目錄 make: *** [env] 錯誤 1

但是當我source venv/bin/activate在 shell 中複製並運行時,它運行良好。我需要在 Makefile 中設定目前目錄嗎?

答案1

source是一個外殼內置命令,不是可以從 shell 之外的任何地方啟動的可執行檔。作用source是讀取並執行檔案的內容在當前外殼中,無需啟動新的 shell

其目的是修改目前 shell 的狀態(如果您只是這樣做sh venv/bin/activate,您的 shell 也會執行activate腳本的內容,但隨後完成並退出)。

但你想做的是make修改程式的狀態activate在您產生的 shell 中執行腳本,無論以何種方式make,都不會改變所make看到的環境的任何內容。
這是因為由另一個程式(B) 啟動的每個程式(A) 都會獲得啟動程序(B) 環境的自己的副本,它(A) 可以根據自己的意願更改該副本,而不會影響啟動程序的環境( B)。

所以,你想做的事即使在理論上也是行不通的。

如果您需要在 venv 中執行某些 Makefile,則必須activate先取得腳本,然後從修改後的 shell 中啟動make;而不是相反。

相關內容