Path
Make找不到命令,但該命令在shell中有效
我已經
make
安裝了,我已經安裝了riscv32-unknown-linux-gnu
工具鏈。我已經添加
riscv/bin
到我的路徑中。我可以在 shell 中成功執行任何工具鏈命令。例如riscv32-unknown-linux gnu-as ... hello.s -o boot.o
作品。當我執行
which riscv32-unknown-linux-gnu-as
時,終端上沒有列印任何內容。當我
make
在我的makefile目錄中執行時,我得到riscv32-unknown-linux-gnu-as -march=rv32i -mabi=ilp32 hello.s -o hello.o make: riscv32-unknown-linux-gnu-as: Command not found Makefile:18: recipe for target 'hello.o' failed make: *** [hello.o] Error 127
看來這是我的路徑有問題?我不確定為什麼 which 和 make 找不到它,但我可以很好地執行它。
** 編輯 **
~/.profile
export PATH="~/riscv/bin:$PATH"
我唯一能想到的是路徑很奇怪,這是在 WSL 上
波浪號 (
~
) 在雙引號中使用時通常不會擴展到您的主目錄。如果您查看您的$PATH
值,您會看到它包含一個文字波浪號,而不是您的主目錄的完整路徑(如果您沒有在賦值中雙引號,它會這樣做)。
make
用於執行 shell 命令(可能/bin/sh
是dash
shell)的 shell 和您的which
命令不會對$PATH
. 這就是為什麼兩者都make
找不到which
您需要使用的命令的原因。
bash
另一方面,shell 在檢查 時會執行額外的波浪號擴展步驟,$PATH
因此這就是您可以在命令行上使用該命令的原因。在這種情況下,這是一個奇怪的情況,因為實用程序在使用變數
bash
時不需要擴展波浪號。$PATH
解決方案:
- 使用
$HOME
而不是~
在您的.profile
.$HOME
總是表現得像一個正常的變數。- 不要引用賦值中的值(無論如何都不需要)。
- 通過將變數設置為系統上執行檔的路徑,
make
用於在Makefilebash
中執行 shell 命令(我不會這樣做,因為我認為錯誤是你的值,而不是shell 對它的處理) .make``SHELL``bash``$PATH``/bin/sh
進一步閱讀:
- 為什麼波浪號 (~) 不在雙引號內展開?’t-the-tilde-expand-inside-quotes
- ~ 總是等於 $HOME
另請注意,由於
PATH
已經導出(它是一個環境變數),因此您永遠不必export
在 shell 的啟動文件中使用它。