web-dev-qa-db-ja.com

BIN_DIR = "〜/ bin /"のスクリプトでmkdirが失敗する(そのようなファイルまたはディレクトリがない)のはなぜですか?

Mkdirコマンドが「No such file or directory」で失敗するのはなぜですか?

#!/bin/bash

set -e

BIN_DIR="~/bin/"

if [ ! -d "$BIN_DIR" ]; then
  mkdir "$BIN_DIR"
fi
10
Hendré

Zannaの answer で説明されているように、チルダ~が引用されているため、エラーメッセージが生成されます。 ~を使用する場合、スクリプトの関連部分は次のようになります。

BIN_DIR=~/bin/

理由は何でも で文字列を引用したい場合は、環境変数$HOMEを使用できます。

BIN_DIR="$HOME/bin/"

私の意見では、2番目のアプローチはより良い方法です。

9
pa4080

~が引用されているため、機能しません。 二重引用符"抑制 チルダ展開 。リテラル名~/binのディレクトリはありません。 man bash (強調鉱山)で説明されているように:

チルダ拡張

Wordがnquotedチルダ文字( `〜 ')で始まる場合、最初の引用符で囲まれていないスラッシュ(または引用符で囲まれていないスラッシュがない場合はすべての文字)に先行するすべての文字は、チルダプレフィックスと見なされます。チルダプレフィックス内の文字が引用符で囲まれていない場合、チルダに続くチルダプレフィックス内の文字は、可能なログイン名として扱われます。このログイン名がヌル文字列の場合、チルダはシェルパラメータHOMEの値に置き換えられます。 HOMEが設定されていない場合、代わりにシェルを実行しているユーザーのホームディレクトリが代わりに使用されます。それ以外の場合、チルダプレフィックスは、指定されたログイン名に関連付けられたホームディレクトリに置き換えられます。

引用符は削除できます。これは、~がパス~/binでシェルに展開を実行させる唯一の文字であり、この場合は展開が必要だからです。シェル 実行されません チルダ展開の結果についてのさらなる展開、 少なくともBash 4 では、これは、Ubuntu have のすべての現在またはリモートの最近のリリースです。したがって、ホームディレクトリにスペースなどの特殊な文字が含まれていても、問題ありません。

または、代わりに$HOMEを使用できます of ~。これは、 parameter expansionによってのみ二重引用符で抑制されないためです。 /単一引用符 。二重引用符doは、展開された値自体がそれ以上展開されないようにするため、 Word splitting または filename expansion は発生しません。したがって、$HOMEは、二重引用符を保持している限り、奇妙な名前のホームディレクトリでも機能します。

22
Zanna