$HOMEがここでHOME変数を拡張しないのはなぜですか?

$HOMEがここでHOME変数を拡張しないのはなぜですか?

簡単なスクリプトを書いた。

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

入力を次のように指定します。

$HOME

出力は次のとおりです

$HOME

書くなら

echo "$HOME"

出力

/home/sam

では、前者の場合はどうでしょうか?

答え1

path~になるひも $PATH、「説明」より。この解釈は特定の状況でのみ発生します。たとえば、インタラクティブシェルコマンドプロンプトに「bare」と入力しても確かにそうでない場合(そうでなければ、埋め込みテキストファイルを読み取ることはreadできません!)read$

覚えている、拡張どこでもアクティブにしたくない機能です。これにより、変数を内容ではなく変数に渡すプログラムの作成が困難になります。したがって、プログラミング言語の設計者(またはシェルの場合は数十年間の有機開発)が拡張する部分と拡張しない部分を決定します。ここには実際の「理由」はありません。定義された方法にすぎません。

あなたが望むなら、eval value="$path"それを得ることができます。デフォルトでは、入力をシェルプロンプトにし、ユーザーが$(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

関連情報