コマンドラインで OS X のエイリアスを解決する

シンボリックリンクと異なり、ターミナルのコマンドは (OS X の) エイリアスを解決してくれません。

$ cd 名称未設定フォルダ\ のエイリアス
-bash: cd: 名称未設定フォルダ のエイリアス: Not a directory

エイリアスを解決してくれるコマンドがあればよいのですが、見当たらなかったのでシェルスクリプトを書いてみました。

osascript コマンドを使えばコマンドラインからAppleScriptを実行出来るので、これを利用します。

#!/bin/sh

# エイリアスへのパスを引数として渡すと、そのエイリアスが指す先を標準出力に出力する
# エイリアスでないものへのパスや、存在しないパスを渡した場合はそれをそのまま出力する
osascript -e '
on run fname
	try
		tell application "Finder"
			return POSIX path of (original item of (fname as POSIX file as alias) as alias)
		end tell
	on error
		return fname
	end try
end run
' "$1" 2>/dev/null

とりあえず以上のスクリプトを resolve_osx_alias という名前で保存し、実行権限をつけてパスの通ったところに置けば以下のような感じでエイリアスを解決出来ます。

$ resolve_osx_alias 名称未設定フォルダ\ のエイリアス 
/Users/nakt/Desktop/名称未設定フォルダ/

$ pwd
/Users/nakt/Desktop
$ cd "`resolve_osx_alias 名称未設定フォルダ\ のエイリアス`"
$ pwd
/Users/nakt/Desktop/名称未設定フォルダ

おまけ: bashエイリアスに直接 cd 出来るように

以下の記述を ~/.bashrc に加えることで直接フォルダのエイリアスに cd 出来るようになります。

cd(){
	command cd "`resolve_osx_alias "$1"`"
}
$ pwd
/Users/nakt/Desktop
$ cd 名称未設定フォルダ\ のエイリアス
$ pwd
/Users/nakt/Desktop/名称未設定フォルダ

おまけ2: Emacs

Emacsエイリアスを解決してくれません。
上記の resolve_osx_alias をパスの通ったところに置いた上で .emacs.d/init.el に以下の記述を加えれば、
C-x C-f や dired などでファイルを開く際にエイリアスを解決してくれるようになります。

(when (= (shell-command "which resolve_osx_alias") 0) ; resolve_osx_alias コマンドが存在すれば
	; find-file-noselect の第一引数を resolve_osx_alias コマンドに通す
	(defadvice find-file-noselect
	  (before resolve-osx-alias)
	  (ad-set-arg
	   0
	   (replace-regexp-in-string
		"\n$" ""
		(shell-command-to-string
		 (concat "resolve_osx_alias "
				 (shell-quote-argument (ad-get-arg 0)))))))
	(ad-activate 'find-file-noselect))