やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

bashにおけるホームディレクトリの最も安全な指定方法

"${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}/..."の形式が最も安全かつ確実にユーザディレクトリを指定できる方法である。

所感

bashでは常識。だが、覚えておかねばならないルールが多い。たまにshellを書くと忘れててハマる。