回答:
~
Zannaの回答で説明されているように、チルダが引用されているため、エラーメッセージが生成されます。を使用する場合~
、スクリプトの関連部分は次のようになります。
BIN_DIR=~/bin/
以下のためならばどんな理由あなたは、文字列を引用したい、あなたは環境変数を使用することができます$HOME
:
BIN_DIR="$HOME/bin/"
私の意見では、2番目のアプローチはより良い実践です。
$HOME
が、スクリプトで使用することも良い考えです。
$HOME
か?あなたが与えた唯一の説明は、「あなたはあまり注意を払うべきではないので、それはより良い考えです」と言うことです。どういう意味かわかりません。編集でそれについて説明できますか?それがなければ、あなたの答えを裏付けるものは何もないので、確かにそれはそれに属しています。チルダ展開はのためにPOSIXによって要求されてきた今、かなり長い間 とスクリプトのhashbangラインがあり#!/bin/bash
、私は移植性が理由ではないと仮定して。
~
引用されているため機能しません。二重引用符 "
はチルド展開を抑制します。リテラル名のディレクトリはありません~/bin
。man bash
(強調鉱山)で説明されているように:
チルダ拡張
単語が引用符で囲まれていないチルダ文字( `〜 ')で始まる場合、最初の引用符で囲まれていないスラッシュの前のすべての文字(または引用符で囲まれていないスラッシュがない場合はすべての文字)は、チルダ接頭辞と見なされます。チルダ接頭辞の文字が引用符で囲まれていない場合、チルダに続くチルダ接頭辞の文字は、可能なログイン名として扱われます。このログイン名がnull文字列の場合、チルダはシェルパラメータHOMEの値に置き換えられます。HOMEが設定されていない場合、シェルを実行しているユーザーのホームディレクトリが代わりに使用されます。それ以外の場合、チルダプレフィックスは、指定されたログイン名に関連付けられたホームディレクトリに置き換えられます。
あなたは引用符を削除することができているので、~
パス内の唯一の文字である~/bin
シェル拡張を行うことになります、と私たちは、この場合の拡大を求めています。シェルは、少なくともBash 4ではチルダ拡張の結果に対してそれ以上の拡張を実行しません。これは、Ubuntuの現在のリリースまたは最近のすべてのリリースにあります。したがって、ホームディレクトリにスペースなどの通常とは異なる文字が含まれていても問題ありません。
または$HOME
~
、の代わりに使用できます。これは、パラメーターの展開が二重引用符によって抑制されず、単一引用符によってのみ抑制されるためです。二重引用符は、展開された値自体がそれ以上展開されないようにするため、単語の分割やファイル名の展開は行われません。だから、$HOME
限り、あなたが二重引用符を保つよう、あまりにも奇妙な名前のホームディレクトリで動作します。
cd '~'
です-bash: cd: ~: No such file or directory
。
~
パラメータ展開の一部ではありません。