やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

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/workoutput.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

 pwdPrint Working Directoryの略らしい。

 ワーキングディレクトリを標準出力するコマンドという意味だろう。ところで、以下が混同する。

cd

 cdChange Directoryの略らしい。

  • Bashのコマンド置換$(コマンド)は、`コマンド`でも可。ただしネストできない
  • $変数名${変数名}でも可。テキスト部分と明確に分けたいときなどで使うべき
  • シングルクォート'は文字列リテラルになり変数展開しない。ダブルクォート"はする

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux