ターミナルからAppleScriptファイルを実行したときの動作に関して
ターミナルから’osascript ファイル名.scpt’とコマンドを入力してApplescriptを実行した時、
ファイル名.scptファイルの”更新日”が変更されるのですがこれはなぜですか? (ファイルの内容は何も更新されていない)
また、これを回避する(日付を更新しない)方法はありませんか?
ターミナルから’osascript ファイル名.scpt’とコマンドを入力してApplescriptを実行した時、
ファイル名.scptファイルの”更新日”が変更されるのですがこれはなぜですか? (ファイルの内容は何も更新されていない)
また、これを回避する(日付を更新しない)方法はありませんか?
明けましておめでとうございます。
以下は Mojave 10.14.6 と Parallels Desktop 上の Monterey 12.6.2 で検証しました。Ventura でもおそらく同じだと思いますが、違ってたらごめんなさいということで。
で、本題。
トップレベルに変数が存在すると、osascript で実行した際にファイルが再保存され「変更日」が更新されるようです。セキュリティ上の理由からなのかなと思ってます。
x.scpt
on run
set a to "hello"
end run
実行
osascript x.scpt #=> 変更日が更新される
回避策はこんな感じでしょうか。
a.scpt
on run
main()
end run
on main()
set a to "hello"
end main
実行
osascript a.scpt #=> 変更日はそのまま
property を使う場合はちょっと面倒で、スクリプトオブジェクトを使うと良いようです。
b.scpt
on run
main()
end run
on main()
script obj
property x : "hello"
on run
return x
end run
end script
run obj
end main
実行
osascript b.scpt
それか、スクリプト形式 (.scpt) ではなく、スクリプトバンドル形式 (.scptd) を使う手もあります。まあ、これが一番簡単でしょうかね。ただし、その場合も scptd 内部の main.scpt は更新されます。
あと、テキスト形式 (.applescript) でも大丈夫です。ただ、テキスト形式の場合はテキストエンコーディングの問題があり、取り扱いがとても面倒なのが難点です。テキスト形式の場合はスクリプトエディタを使わないことをおすすめします。
以上、長々と書きましたがファイルのタイムスタンプを気にしない、、、というのも解決策の一つかも。
明けましておめでとうございます。
以下は Mojave 10.14.6 と Parallels Desktop 上の Monterey 12.6.2 で検証しました。Ventura でもおそらく同じだと思いますが、違ってたらごめんなさいということで。
で、本題。
トップレベルに変数が存在すると、osascript で実行した際にファイルが再保存され「変更日」が更新されるようです。セキュリティ上の理由からなのかなと思ってます。
x.scpt
on run
set a to "hello"
end run
実行
osascript x.scpt #=> 変更日が更新される
回避策はこんな感じでしょうか。
a.scpt
on run
main()
end run
on main()
set a to "hello"
end main
実行
osascript a.scpt #=> 変更日はそのまま
property を使う場合はちょっと面倒で、スクリプトオブジェクトを使うと良いようです。
b.scpt
on run
main()
end run
on main()
script obj
property x : "hello"
on run
return x
end run
end script
run obj
end main
実行
osascript b.scpt
それか、スクリプト形式 (.scpt) ではなく、スクリプトバンドル形式 (.scptd) を使う手もあります。まあ、これが一番簡単でしょうかね。ただし、その場合も scptd 内部の main.scpt は更新されます。
あと、テキスト形式 (.applescript) でも大丈夫です。ただ、テキスト形式の場合はテキストエンコーディングの問題があり、取り扱いがとても面倒なのが難点です。テキスト形式の場合はスクリプトエディタを使わないことをおすすめします。
以上、長々と書きましたがファイルのタイムスタンプを気にしない、、、というのも解決策の一つかも。
Hiro__Sさん、
あけましておめでとうございます。
本年もよろしくお願いいたします。
ご提示いただいた件、完璧です!
階層を一段落とす方法ですべてうまいきました。
USEを使っているものがありましたがスクリプトオブジェクトに変更してうまく動きました。
>ファイルのタイムスタンプを気にしない、、、というのも解決策の一つかも。
これもごもっともなのですが、以下の理由により無視できないことになりまして今回の質問に至ったわけです。
(本件の原因)
Hiro__Sさんはご存じのとおり、私はAlfred Workflowを駆使してAppleScriptを使った自動化をおこなっております。
また、その環境をDropboxを使用して複数のMacで同期しております。(正確にはおりました...本件理由によりクラウド同期を中止中)
今般、Dropboxがアップデートされ、OneDriveやiCloudドライブと同じ"CloudStorage"フォルダを利用する形に仕様変更されましたが、これによりファイル同期のタイミングが異常に非効率(遅く)なり、結果として更新ファイルの”競合”が多発して同期がうまく機能しないようになってしまいました。
以上の理由により、不要なファイル更新を回避したいとおもった次第です。
現在はDropboxでの同期を中止し、自前NAS経由の手動同期で運用しています。
なお、Alfred Workflowにおいて、スクリプトファイル起動ではなくて直接スクリプトを書き込んでしまうことでファイル更新の問題は回避できるのですが、これではスクリプトの管理がしにくいのであくまでもスクリプトは単ファイルとして独立させて管理したいのです。
続きです。
わかれば教えてくださいませんか?
以下のコマンドが、bashシェルでは問題ないのですがzshシェルで実行するとエラーになります。理由は何でしょう?
bash(正常)
MacBookPro:~ xxx$ osascript ~/Library/Scripts/'Music Player.scpt' {1,1,1,fiesta*chick}
MacBookPro:~ xxx$
zsh(エラー)
xxx@MacBookPro ~ % osascript ~/Library/Scripts/'Music Player.scpt' {1,1,1,fiesta*chick}
zsh: no matches found: fiesta*chick
xxx@MacBookPro ~ %
パラメータに*(アスタリスク)があるとエラーになります。アスタリスクがないとzshでもエラーにはなりません。
どういう理由でエラーになるのでしょうか?
下書きしたらとてつもない長文になってしまって、どうしたものか考えているうちに自己解決したようですね。
ざっくり言うと、パターンマッチが行われ、マッチしなかった場合に zsh と bash ではデフォルトの挙動が異なるということです。
解決策はいくつか考えられますが、私なら次のようにします。
osascript "${HOME}/Library/Scripts/Music Player.scpt" 1 1 1 'fiesta*chick'
Hiro__Sさん、こんばんわ。
アドバイスありがとうございます。
>ざっくり言うと、パターンマッチが行われ、マッチしなかった場合に zsh と bash ではデフォルトの挙動が異なるということです。
ここは私には理解できませんので申し訳ありませんがスルーさせていただきます。
>解決策はいくつか考えられますが、私なら次のようにします。
>osascript "${HOME}/Library/Scripts/Music Player.scpt" 1 1 1 'fiesta*chick'
”パラメータをシングルクォーテーションで囲む”という解釈でよろしいでしょうか?
試してみましたら、うまく動作しました。
どうもありがとうございました。
”パラメータをシングルクォーテーションで囲む”という解釈でよろしいでしょうか?
引数にシングルコーテーションが入ってなければそれでほぼ大丈夫。シングルコーテーションが入ってる場合はちょっと面倒で、クォートを一度閉じて「'」を「\'」とすると良いです。
It's a Small World
↓
'It'\''s a Small World'
エスケープすべき文字は「*」や「'」の他にもありますが、それらの文字もこの方法 (シングルコーテーションで括る方法) でほぼ大丈夫です。
回答がみつかりました。
こちらです。
zsh | アスタリスクを打つと zsh: command not found: と表示されてしまう時は noglob - Qiita
コマンドの前に"noglob"を追加するだけでいいんですね。
アドバイスありがとうございます。
>エスケープすべき文字は「*」や「'」の他にもありますが、それらの文字もこの方法 (シングルコーテーションで括る方法) でほぼ大丈夫です。
使用する特殊文字は基本的に"*"と"+"(アスタリスクとプラス)だけなのでこの方法がわかりやすくていいですね。
セキュリティ上の理由からなのかなと思ってます。
Lion で試したところ変更日が更新されました。最近の macOS ではセキュリティがかなり強化され、その絡みかと思ったのですが、そうでもなさそうです。ということで、前言撤回します。
ターミナルからAppleScriptファイルを実行したときの動作に関して