bashのチルダ展開、~ と ~name の違い

今までbashのチルダ展開で、~ はシェル実行ユーザーがnameの時の ~name と同じだと思っていたのですが、違うということに気がつきました。

  • ~name
    ユーザー name のホームディレクトリ。つまり、/etc/passwdにかかれているディレクトリ。
  • ~
    $HOMEの値。$HOMEがなければシェル実行ユーザーのホームディレクトリ。

通常、$HOMEはそのシェル実行ユーザーのホームディレクトリが設定されているので、今まで違いに気がつきませんでした。
なぜ気がついたかというと、

duplicityを/etc/cron.daily/にスクリプトをおいてうごかしています。コマンドラインからこのスクリプトを動かすとうまく動くのですが、crondから動かされると下記のエラーでうまく動きませんでした。

GPGError: GPG Failed, see log below:
===== Begin GnuPG log =====
gpg: no default secret key: No secret key
gpg: [stdin]: sign+encrypt failed: No secret key
===== End GnuPG log =====

これ自体は、duplicityのオプションに、--gpg-options="--homedir=/root/.gnupg" をつければ動いたのですが、なぜcrondからの起動では明示的に指定しなければならないのかを調べてみました。

gpgのマニュアルではhomedirのデフォルトは、~/.gnupgと書いてあります。
一方、/etc/cron.*ly/*が起動される元の方、/etc/cron.d/0hourly は、

$ cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

と、HOMEに/が設定されています。そこで改めてbashのマニュアルをみたところ、上述の思い違いに気がつきました。なぜ、HOMEに/を設定しているのかはわかりません。rootのホームディレクトリが/だったころの名残でしょうか?今度調べてみよう。
ちなみに、失敗したときに作成されたらしい/.gnupg ディレクトリが出来ていたので削除しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA