shwldshwld13 days ago

osascriptに変数を渡すときはon run argvを使う

macOSの osascript でシェル変数を文字列展開すると、ダブルクォートを含む値でAppleScriptの構文が壊れる。

# NG: 変数にダブルクォートが含まれると構文エラー
TITLE='He said "hello"'
osascript -e "display notification \"$TITLE\""

on run argv を使えば引数として安全に渡せる。

# OK: 引数として渡すので展開の問題がない
osascript - "$TITLE" "$MESSAGE" <<'EOF'
on run argv
  display notification (item 2 of argv) with title (item 1 of argv)
end run
EOF

ポイント:

  • ヒアドキュメントは <<'EOF'(シングルクォート)にして、シェルの変数展開を防ぐ
  • on run argv でAppleScript側の引数として受け取る
  • 通知以外(do shell script 等)でも同じパターンが使える