旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Shell] $(cd $(dirname $0) && pwd) を理解する

2011年8月14日

CURRENT=$(cd $(dirname $0) && pwd) とは

これは CURRENT変数へスクリプトファイルのカレントディレクトリを格納する
シェルスクリプトのお便利ワンライナーです

#!/bin/sh
CURRENT=$(cd $(dirname $0) && pwd)
echo $CURRENT # -> どこから実行してもファイルの場所を返す

しかし、意味不明

最近これを知って便利に使っているんですが、自分のShellScrpit力の低さから理解不能でした
ということで、勉強することにしました

各要素の解説

特殊変数や記法などの整理です

$0 = スクリプトファイル名が入る
dirname 引数 = 引数文字列のディレクトリ部分だけを返す
&& = 左辺のコマンドがステータス0の正常終了なら右辺も実行する
$() = プログラミングの (式) と同じように式の分離や実行順序を明示するものみたい
pwd = カレントディレクトリを返す、説明不要だと思いますが

実行順序

こうみたいです
「cd でスクリプト設置場所へ移動した後に pwd でその場所を返している」というロジック

dirname $0
 ↓
cd $(dirname $0)
 ↓
cd $(dirname $0) && pwd
 ↓
CURRENT=$(cd $(dirname $0) && pwd)

疑問点

なんで cd をしているのにディレクトリが移動しないのでしょうか?

$( ~ ) 書式によるものっぽいのですが、これがわからないです。
解説サイトを絶賛募集中!

追記:$() は `(バッククォート)と同じでした

@paselaさんにご教授賜りました
以下、コメントの抜粋、詳細はコメント欄を参照願います

$(〜)はコマンド置換の構文。`〜`(バッククォート)と同じ。
バッククォートはエスケープとか入れ子がややこしくなるので普通は使わない。
コマンド置換はサブシェルで実行されるので、元の環境には影響を与えない。