Mkdirコマンドが「No such file or directory」で失敗するのはなぜですか?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
~
が引用されているため、機能しません。 二重引用符"
抑制 チルダ展開 。リテラル名~/bin
のディレクトリはありません。 man bash
(強調鉱山)で説明されているように:
チルダ拡張
Wordがnquotedチルダ文字( `〜 ')で始まる場合、最初の引用符で囲まれていないスラッシュ(または引用符で囲まれていないスラッシュがない場合はすべての文字)に先行するすべての文字は、チルダプレフィックスと見なされます。チルダプレフィックス内の文字が引用符で囲まれていない場合、チルダに続くチルダプレフィックス内の文字は、可能なログイン名として扱われます。このログイン名がヌル文字列の場合、チルダはシェルパラメータHOMEの値に置き換えられます。 HOMEが設定されていない場合、代わりにシェルを実行しているユーザーのホームディレクトリが代わりに使用されます。それ以外の場合、チルダプレフィックスは、指定されたログイン名に関連付けられたホームディレクトリに置き換えられます。
引用符は削除できます。これは、~
がパス~/bin
でシェルに展開を実行させる唯一の文字であり、この場合は展開が必要だからです。シェル 実行されません チルダ展開の結果についてのさらなる展開、 少なくともBash 4 では、これは、Ubuntu have のすべての現在またはリモートの最近のリリースです。したがって、ホームディレクトリにスペースなどの特殊な文字が含まれていても、問題ありません。
または、代わりに$HOME
を使用できます of ~
。これは、 parameter expansion が によってのみ二重引用符で抑制されないためです。 /単一引用符 。二重引用符doは、展開された値自体がそれ以上展開されないようにするため、 Word splitting または filename expansion は発生しません。したがって、$HOME
は、二重引用符を保持している限り、奇妙な名前のホームディレクトリでも機能します。