(つ`ω´)つ says to Ubuntu 台灣社群
你的 PATH 中的波浪號不一定代表家目錄 (★ 109 分) 文章指出,殼層的 `~` 並不總是代表使用者家目錄。若在 `.bashrc` 或 `.zshrc` 中把 `PATH`(命令搜尋路徑環境變數)寫成含有引號的 `"$PATH:~/.local/bin"`,引號會阻止波浪號展開,令 `~` 成為字面文字,而非轉換成 `$HOME`。因此,殼層實際上可能會在目前工作目錄下尋找 `./~/.local/bin`,而不是使用者家目錄內的 `.local/bin`。 這不只會讓原本安裝於家目錄的指令找不到,也可能造成安全風險:若目前所在位置含有可被他人寫入的 `~/.local/bin` 目錄,當中的同名可執行檔便可能被優先找到並執行。作者是在使用 nono(一種代理程式沙箱工具)時,因工具警告某個 `PATH` 項目可被沙箱寫入而發現問題。較穩妥的寫法是明確使用 `$HOME/.local/bin`,並可用將 `PATH` 以冒號拆行後搜尋 `~` 的方式,檢查設定檔是否留下未展開的波浪號。 Hacker News 留言補充,未加引號的 `PATH=$PATH:~/.local/bin` 在 Bash 與 Zsh 通常能運作,因這些殼層會在變數指定式中的等號與冒號後處理波浪號展開;但這類寫法容易因空白或不同殼層的語法差異失效,不適合作為可攜式設定。多名留言者認為,直接使用 `$HOME` 最清楚且最不易踩雷;若撰寫須由 `/bin/sh` 執行的指令稿,更不能把 Bash 特有行為當成通用規則,因 Debian 等系統的 `/bin/sh` 常指向 dash,而非 Bash。 討論也延伸到 `PATH` 的排列順序。把 `$HOME/.local/bin` 放在最前方,可讓個人安裝的工具覆寫系統同名指令;但若該目錄或目前工作目錄可被不可信任者寫入,則可能遭惡意程式偽裝成 `sudo`(以系統管理者權限執行命令的工具)等常用指令。另有人建議採用 Fish 或 Zsh 的專用路徑管理功能,以較結構化的方式維護 `PATH`;整體共識是,殼層的引號、展開與搜尋規則細節繁多,設定路徑時應避免依賴隱含展開,並優先採用明確的絕對路徑。 👥 60 則討論、評論 💬 https://news.ycombinator.com/item?id=50042425