Bash

為什麼 $HOME 不在這裡擴展 HOME 變數?

  • January 8, 2022

我寫了一個簡單的腳本。

read -p "Enter the path: " path
echo "$path"

我給輸入為

$HOME

輸出是:

$HOME

如果我寫

echo "$HOME"

輸出

/home/sam

那麼為什麼不是前一種情況呢?

path成為string $PATH,而不是它的“解釋”。這種解釋只發生在特定的上下文中——例如,如果你在互動式 shell 命令提示符下鍵入“bare”;但絕對不在read(否則你不能read用來讀取包含 的文本文件$,例如!)。

請記住,擴展是您永遠不想在任何地方啟用的功能——它會使編寫將變數作為變數而不是內容傳遞的程序變得困難。因此,程式語言設計者(或者在 shell 的情況下,幾十年或多或少的有機開發)決定了這種擴展發生在哪裡,哪裡不發生。這裡沒有真正的“為什麼”:它是如何定義的。

如果你願意,你可以eval value="$path",然後你就明白了。我不建議這樣做,因為它基本上使您的輸入成為 shell 提示,如果使用者輸入,例如,$(rm -rf /)這將允許他們刪除所有內容……

總而言之,我覺得這更像是一個軟體設計問題:你想讓使用者做什麼樣的事情?

在這種情況下,$HOME可能幾乎是您想要允許的唯一“特殊”情況。我建議將其替換為~,因為它是規範的縮寫形式,並執行以下操作:

read "Enter foo bar baz:" raw_path
if [[ ( ! -d "${raw_path}" ) && "${raw_path:0:1}" = "~" ]]; then
 _path="${HOME}${raw_path:1:}"
else
 _path="${raw_path}"
fi

引用自:https://unix.stackexchange.com/questions/685558