絶対パスと相対パス
手元では動くのに、自動実行にすると落ちる
自分で打つと動くスクリプトが、定時実行に登録した途端にファイルを見つけられなくなる。原因のほとんどは、パスの書き方が「今いる場所」に頼っていることです。自動実行の仕組みは、こちらが想定した場所からスクリプトを起動してくれるとは限りません。
Linux でファイルを指す書き方は 2 通りあります。/ から書き始めるのが絶対パス、今いる場所から書き始めるのが相対パスです。
/ から書くか、今いる場所から書くか
ターミナル
ls /usr/share/doc/usr/share/doc は絶対パスです。頂点の / から順にたどるので、どこで打っても同じ場所を指します。住所を郵便番号から書くようなものです。
ターミナル
cd /usr
ls share/docこちらの share/doc は相対パスです。今 /usr にいるからこそ /usr/share/doc に届きます。同じ 1 行を /home で打てば別の場所を探しに行って失敗します。「ここから 2 軒先」という書き方なので、起点が変われば指す先も変わります。
見分け方は簡単で、先頭が / なら絶対パス、そうでなければ相対パスです。
. と .. と ~
| 書き方 | 指す先 |
|---|---|
. | 今いる場所 |
.. | 1 つ上 |
~ | 自分のホーム |
ターミナル
cd /var/log
ls ../lib.. は 1 つ上なので、/var/log から見た ../lib は /var/lib です。~/.bashrc のように ~ を頭に付ければ、ユーザー名が違うマシンでも自分のホームを指せます。./run.sh の . は今いる場所そのもので、「同じディレクトリにあるこれ」と明示したいときに使います。
起点を先に決めてしまう
冒頭の話に戻ります。どこから起動されても同じ場所を見てほしいときは、絶対パスで書くのが確実です。それが長くなって読みにくいなら、スクリプトの先頭で起点を決めてしまう手もあります。
ターミナル
cd /opt/report置き場所が決まっているなら、この 1 行を先頭に置くだけで、以降に書く相対パスの意味が固定されます。逆に、リポジトリの中で完結する処理は相対パスのままにしておくと、別のマシンに持って行っても書き換えずに済みます。移植のしやすさと確実さを、この 2 つで釣り合わせます。
課題
- 絶対パスでファイル作成
- cd 後に相対パスで cat
- hello が出力される