まとめ

  • シェルスクリプトをAlfredから直接実行すると無駄にターミナルが立ち上がる
  • Automatorならターミナルを立ち上げずにスクリプトを実行できる

Automatorでスクリプトを実行する

前回(Evernoteのノートリンクが仕様変更で使い物にならないので何とかしようとした) では、
スクリプトの実行方法が微妙たったのでもう少し修正してみました。

結論としては、Macと標準で入っているAutomatorを使うことで、
ターミナルアプリを立ち上げずにシェルスクリプトを実行できます。

Automatorのワークフローを作る

単体のアプリケーションとして実行するため、
Automatorを立ち上げアプリケーションを選択します。

実行ディレクトリの取得

私の環境では、clipboardのインストール先はグローバルではなく、
スクリプトのあるフォルダにbundler専用のディレクトリを作り、
そこにインストールしています。

そのため、スクリプトを実行するためにはそのパスに移動しないといけません。
ですが、Automatorを実行した場合、
カレントパスはユーザのホームディレクトリになり、
実行したファイルのディレクトリではありません。
参考: iNSTANTWiNE or Wine.framework と Automator の連携

そのため、Apple Scriptを先に実行し、
Automatorの実行ファイルがあるパスを求め、
そこに移動するようにしています。

自分自身のパスを求めるApple Script

on run {input, parameters}
set p to POSIX path of (path to me)
return {p}

return input
end run

AutomatorのAppleScriptを実行を選び、
このスクリプトを後述するシェルスクリプトの前に実行するようにします。
これでシェルスクリプトに引数としてパスを渡せます。

Evernote URLを置換するスクリプト

内容はほぼ前回と同じです。
ただし、各種環境設定は読み込んでくれないため、
sourceで読み込む必要があります。

また、Automator側で引数の引き渡し方法を
引数としてに設定する必要もあります。

source .zshrc

pushd $(dirname $1)

bundle exec ruby -e "
require 'clipboard'

url = Clipboard.paste
r = Regexp.new(\"https://www.evernote.com/shard/s2/nl/([0-9]*)/(.*)/\")
result = r.match url
if result
  new_url = \"evernote:///view/#{result[1]}/s2/#{result[2]}/#{result[2]}/\"
  p new_url
  Clipboard.copy new_url
end
"

popd

こうして作ったアプリケーションを.appに書き出し、
Alfredから実行することでターミナルを立ち上げることなく、
クリップボードのノートリンクを置換できます。

完成品

できあがったスクリプトは
https://github.com/ota42y/dotfiles/tree/master/home/.scripts/evernote_url_replace
にあります。

github上では.appがフォルダとして扱われていますが、
Mac上ではアプリケーションとして扱われます。

このエントリーをはてなブックマークに追加