Linuxで任意のディレクトリから相対パスを使って特定のパスを指定する方法
Linuxで任意のディレクトリから相対パスを使って特定のパスを指定する方法を紹介します。
1.やりたいこと
何を言っているのかよく分からないと思うのでサンプルで説明します。
とあるスクリプト
/opt/foo/bin/bar.sh
を作りました。
このスクリプトを起動する条件として、次の3つがあります。
- 任意のディレクトリから実行可能(スクリプトはフルパス指定)
- スクリプトのオプションパラメータでコンフィグファイルを相対パスで指定
- 相対パスの変更は不可
条件を含めた具体的な内容ですが、まず、
$ cd /home/foo
$ cd /home/bar/test
$ cd /var
といった任意のディレクトリに移動します。
そのあとスクリプトを起動するのですが、起動時のオプションパラメータで、
/opt/foo/bin/bar/bar.conf
を指定する必要があります。
/opt/foo/bin/bar.sh /opt/foo/bin/bar/bar.conf
ただし上記のような絶対パスは指定できず、なぜかカレントディレクトリからの相対パスしか許容されていません。
/opt/foo/bin/bar.sh ../../bin/bar/bar.conf
しかも相対パスの部分は変更できないものとします。
つまり、cdのみ手動で好きなディレクトに移動し、そのあとスクリプトをラップしたシェルスクリプトを実行するようなイメージです。
シェルスクリプトであればpwdでカレントディレクトリを取得してそのパスを利用できますが、それもできない条件なのでオプション部分は固定文字列です。
まとめると、
% cd /home/foo
% /opt/foo/bin/bar.sh コンフィグファイルまでの相対パス指定
% cd /home/bar/test
% /opt/foo/bin/bar.sh コンフィグファイルまでの相対パス指定
% cd /var
% /opt/foo/bin/bar.sh コンフィグファイルまでの相対パス指定
という、それぞれのスクリプト起動で「コンフィグファイルまでの相対パス指定」には一意のパスを指定しなければならないのですが、指定方法が分かりません。
やりたいことを図示すると次のようになります。
カレントディレクトリからの相対パスなので、目的のディレクトリに移動するためには次のようにディレクトリをたどる必要がありますが、普通に考えればそれぞれのカレントディレクトリから目的のディレクトリまでの相対パスはバラバラです。
2.対処方法
お気づきの方も多いと思いますが、一旦ホームディレクトリに移動し、そこからの相対パスを指定することで実現できます。
図示すると次のようになります。
コマンドでは次のように指定します。
% cd /home/foo
% /opt/foo/bin/bar.sh ~/../../opt/foo/bin/bar/bar.conf
% cd /home/bar/test
% /opt/foo/bin/bar.sh ~/../../opt/foo/bin/bar/bar.conf
% cd /var
% /opt/foo/bin/bar.sh ~/../../opt/foo/bin/bar/bar.conf
となります。
「~」をパスの先頭に指定すれば、ログインしたユーザーのホームディレクトリ「/home/xxx」に移動することができます。
この方法であれば、どのディレクトリに移動していても必ずホームディレクトリに戻れるので、そこから目的のディレクトリまで一意の相対パスで指定が可能です。
3.cronで起動する場合
「cronで起動するとどうなるんだろう?」と思いましたが、基本的にログインしたユーザ別のcronで作る前提であれば、cronの中で「~」を利用すれば問題なく動作するようです。
2項の例をcronに設定すると、次のようになります。
0 0 * * * cd /home/bar/test; /opt/foo/bin/bar.sh ~/../../opt/foo/bin/bar/bar.conf
- VMをundefineできない場合の対処
- cpanflute2でエラーになる場合の対処
- シェルスクリプトをバイナリ化する「shc」
- OpenSSLで文字列を暗号化・複号化する方法
- sshログインに時間がかかる場合の対処
- vi/vimで範囲指定して置換する方法
- vi/vimでマークした行に移動する方法
- vi/vimで複数行を一括削除する方法
- LinuxでOSキャッシュをクリアする方法
- lessで検索文字列だけを表示する方法
- tailコマンドでファイルがローテートされても追従する方法
- svnでファイルやディレクトリを削除する方法
- phpMyAdminで「unknown system variable 'lc_messages'」となる場合の対処
- Linux(CentOS)でapxsがみつからない場合の対処
- PHP7.3とApacheを連携させる方法