現在の作業ディレクトリによらず、特定のディレクトリに対してコマンドを実行するスクリプトにしたい場合の記述まとめ

スクリプト実行による、意図しないディレクトリ構成の破壊防止にもなるので、明示的にスクリプトの影響が及ぶディレクトリを指定しける記述を心掛けたい。


<関連する記事>
実行場所に依存したスクリプト記述方法▼



スクリプト配置ディレクトリの取得方法


ディレクトリ構成:
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
実行(hogeディレクトリ):
スクリプト'配置'ディレクトリ
../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


以上
このエントリーをはてなブックマークに追加
コメントを閉じる

コメント

コメントフォーム
記事の評価
  • リセット
  • リセット