Bashでカレントディレクトリとスクリプトパスを取得する
よく使うのに忘れる。Bash業界では日常。覚えられるわけがない暗号。
成果物
コード
WORK_DIR="`pwd`" SCRIPT_DIR="$(cd $(dirname $0); pwd)"
用途
たとえば以下のような構成だったとする。
- main.sh
- sub/
- sub1.sh
以下のようなコードになる。
/home/user/scripts/main.sh
WORK_DIR="`pwd`" SCRIPT_DIR="$(cd $(dirname $0); pwd)" MESSAGE="`$SCRIPT_DIR/sub1.sh`" echo "$MESSAGE" > "$WORK_DIR/output.txt"
以下のワーキングディレクトリで実行する。
$ pwd
/tmp/work
$ /home/user/scripts/main.sh
実行後、ワーキングディレクトリ/tmp/work
にoutput.txt
ファイルが作成される。
$ ls -1 | grep output.txt output.txt
デフォルト出力先を、コマンド実行したディレクトリにしたいときに便利。
オプション引数
なお、出力パスを第1コマンド引数で指定したいが、無いときはワーキングディレクトリにしたいときは以下。
main.sh
OUT_DIR="${1:-$(pwd)}"
以下、実行例。
$ pwd /tmp/work $ .../main.sh /some # /some/output.txt $ .../main.sh # /tmp/work/output.txt
おまけ
Bashスクリプトを思い通りに動かすまでのチップスは多すぎる。挙げればキリがない。
実行権限
chmod 755 main.sh
スクリプトを実行させるには、実行権限を付与する必要がある。
相対パスによる実行
./main.sh
先頭に./
を付与せねばならない。ない場合は環境変数PATHに登録されたディレクトリ内にあるいずれかの実行ファイル名でなければならない。
パス結合
OUT_PATH="${SCRIPT_DIR%/}/output.txt"
末尾に/
があれば削除し、/
を付与する。これで/
がダブることがなくなるはず。ただし1つしか削除できない……。
コマンド名
pwd
pwd
はPrint Working Directory
の略らしい。
ワーキングディレクトリを標準出力するコマンドという意味だろう。ところで、以下が混同する。
cd
cd
はChange Directory
の略らしい。
罠
- Bashのコマンド置換
$(コマンド)
は、`コマンド`
でも可。ただしネストできない $変数名
は${変数名}
でも可。テキスト部分と明確に分けたいときなどで使うべき- シングルクォート
'
は文字列リテラルになり変数展開しない。ダブルクォート"
はする
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13 ※
- bash 4.4.12(1)-release ※
- Python 3.5.3
- SQLite 3.29.0 ※
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux