現在の作業ディレクトリによらず、特定のディレクトリに対してコマンドを実行するスクリプトにしたい場合の記述まとめ
スクリプト実行による、意図しないディレクトリ構成の破壊防止にもなるので、明示的にスクリプトの影響が及ぶディレクトリを指定しける記述を心掛けたい。
<関連する記事>
実行場所に依存したスクリプト記述方法▼
スクリプト配置ディレクトリの取得方法
ディレクトリ構成:
script_test
├── hoge // 実行ディレクトリ1
└── script // 実行ディレクトリ2
└── script.sh
bash記述例
script.sh:#!/bin/bash
echo "スクリプト'配置'ディレクトリ"
echo "$(dirname "$0")"
echo "スクリプト'実行'ディレクトリ"
echo "$(pwd)"
csh/tcsh記述例
script.sh:# !/bin/csh
echo "スクリプト'配置'ディレクトリ"
echo `dirname $0`
echo "スクリプト'実行'ディレクトリ"
echo `pwd`
実行結果
実行(scriptディレクトリ):スクリプト'配置'ディレクトリ
.
スクリプト'実行'ディレクトリ
/{dir_path}/script_test/script
スクリプト'配置'ディレクトリ
../script
スクリプト'実行'ディレクトリ
/{dir_path}/script_test/hoge
コマンドの詳細
なにもしていなければ、シェルスクリプトはユーザーの現在の作業ディレクトリを起点として、スクリプト内のコマンドを実行するため、mkdirやtouchのコマンドを書いたスクリプトを実行すると、その場に実行結果が反映される。
そのため、自分がどのディレクトリにいたとしても、一定のディレクトリを起点に動作してほしい場合、以下コマンドを使用する。
コマンド | 説明 |
---|---|
$0 | スクリプトまでの相対パス |
dirname | パスからディレクトリの抜き出し |
スクリプト使用例
どこのディレクトリ位置からスクリプトを実行しても、対象のディレクトリがコマンドの操作対象起点となる。
実行スクリプト(script.sh):
#!/bin/bash
cd $(dirname "$0")
touch memo.txt
初期ディレクトリ構成:
script_test
├── hoge
│ └── script.sh
└── script // 実行ディレクトリ
このscriptというディレクトリ内で上記スクリプトを実行すると、以下のようになる。
実行結果:
script_test
├── hoge
│ ├── memo.txt
│ └── script.sh
└── script // 実行ディレクトリ
scriptディレクトリで実行しても、cd "$(dirname "$0")"で一度をスクリプトを配置しているディレクトリに相対パスで移動しているため、実行場所にかかわらず、スクリプトを配置している場所を起点として、スクリプトを記述することができる。
※スクリプト内でcdしても、シェルスクリプトの実行では、「./script.sh」のように実行することで新しいシェルが立ち上がってコマンドが実行されるため、現在の作業ディレクトリから移動することはない
応用例
cdでディレクトリを移動しなくても、以下のようにファイルパスのみ抽出することもできる。
#!/bin/bash
FILE_PATH=$(dirname "$0")
echo $FILE_PATH
以上