"${HOME}/spa ce"
。
問題
${HOME}
は長いので~/
を使ったが、""
と組合せて"~/"
とすると展開されない。これに気づかず一瞬ハマった。
bashからpythonの起動引数としてホームパスを渡し、python側でexpanduser()しないと、~/
は展開されず、エラーとなる。
解決
"${HOME}/spa ce"
のようにする。
~/
は使わず${HOME}
で統一するとわかりやすいコードになるか。
Pythonなどパスを渡す先での処理には依存させず、bashの時点で展開したほうが確実。コードの統一性もとれる。
パス展開について
コード | 安全性 |
---|---|
"${HOME}/spa ce" |
OK。変数名もスペースも保護され最も安全 |
"$HOME/spa ce" |
OK |
'$HOME/spa ce' |
NG。シングルクォートだと$HOME が展開されずその文字列のまま |
$HOME/spa ce |
NG。スペースはbashのメタ文字。クォートすべき |
~/spa ce |
NG。スペースはbashのメタ文字。クォートすべき |
~/space |
Warn。パスにスペースを含むようになったら使えない |
"/home/username/spa ce" |
Warn。ユーザ名が違う環境では存在しないパスになる |
$HOMEsan/ |
NG。$HOMEの値が/home/my のとき/home/mysan とするつもりが、$HOMEsan という名の変数参照になる。${HOME}san か$HOME'sun' とすべき。 |
- "~/spa ce/"のようにダブルクォートすると
~
が展開されない。- "$HOME/spa ce/"のように
~
の代わりに$HOME
変数を使うべし - ダブルクォートしなければ
~
展開されるが、スペースを含む可能性があるならクォート必須
- "$HOME/spa ce/"のように
よって、"${HOME}/..."の形式が最も安全かつ確実にユーザディレクトリを指定できる方法である。
所感
bashでは常識。だが、覚えておかねばならないルールが多い。たまにshellを書くと忘れててハマる。