ターミナルからAppleScriptファイルを実行したときの動作に関して

ターミナルから’osascript ファイル名.scpt’とコマンドを入力してApplescriptを実行した時、

ファイル名.scptファイルの”更新日”が変更されるのですがこれはなぜですか? (ファイルの内容は何も更新されていない)

また、これを回避する(日付を更新しない)方法はありませんか?

投稿日 2023/01/02 20:26

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2023/01/02 22:30

明けましておめでとうございます。


以下は 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) でも大丈夫です。ただ、テキスト形式の場合はテキストエンコーディングの問題があり、取り扱いがとても面倒なのが難点です。テキスト形式の場合はスクリプトエディタを使わないことをおすすめします。


以上、長々と書きましたがファイルのタイムスタンプを気にしない、、、というのも解決策の一つかも。


返信: 9
スレッドに付いたマーク ランキングトップの返信

2023/01/02 22:30 Pajerow への返信

明けましておめでとうございます。


以下は 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) でも大丈夫です。ただ、テキスト形式の場合はテキストエンコーディングの問題があり、取り扱いがとても面倒なのが難点です。テキスト形式の場合はスクリプトエディタを使わないことをおすすめします。


以上、長々と書きましたがファイルのタイムスタンプを気にしない、、、というのも解決策の一つかも。


2023/01/02 23:33 Hiro__S への返信

Hiro__Sさん、

あけましておめでとうございます。

本年もよろしくお願いいたします。


ご提示いただいた件、完璧です!

階層を一段落とす方法ですべてうまいきました。

USEを使っているものがありましたがスクリプトオブジェクトに変更してうまく動きました。


>ファイルのタイムスタンプを気にしない、、、というのも解決策の一つかも。

これもごもっともなのですが、以下の理由により無視できないことになりまして今回の質問に至ったわけです。



(本件の原因)

Hiro__Sさんはご存じのとおり、私はAlfred Workflowを駆使してAppleScriptを使った自動化をおこなっております。

また、その環境をDropboxを使用して複数のMacで同期しております。(正確にはおりました...本件理由によりクラウド同期を中止中)

今般、Dropboxがアップデートされ、OneDriveやiCloudドライブと同じ"CloudStorage"フォルダを利用する形に仕様変更されましたが、これによりファイル同期のタイミングが異常に非効率(遅く)なり、結果として更新ファイルの”競合”が多発して同期がうまく機能しないようになってしまいました。


以上の理由により、不要なファイル更新を回避したいとおもった次第です。

現在はDropboxでの同期を中止し、自前NAS経由の手動同期で運用しています。


なお、Alfred Workflowにおいて、スクリプトファイル起動ではなくて直接スクリプトを書き込んでしまうことでファイル更新の問題は回避できるのですが、これではスクリプトの管理がしにくいのであくまでもスクリプトは単ファイルとして独立させて管理したいのです。


2023/01/04 05:39 Pajerow への返信

続きです。

わかれば教えてくださいませんか?


以下のコマンドが、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でもエラーにはなりません。


どういう理由でエラーになるのでしょうか?

2023/01/04 07:44 Pajerow への返信

下書きしたらとてつもない長文になってしまって、どうしたものか考えているうちに自己解決したようですね。


ざっくり言うと、パターンマッチが行われ、マッチしなかった場合に zsh と bash ではデフォルトの挙動が異なるということです。


解決策はいくつか考えられますが、私なら次のようにします。

osascript "${HOME}/Library/Scripts/Music Player.scpt" 1 1 1 'fiesta*chick'


2023/01/04 09:54 Hiro__S への返信

Hiro__Sさん、こんばんわ。

アドバイスありがとうございます。


>ざっくり言うと、パターンマッチが行われ、マッチしなかった場合に zsh と bash ではデフォルトの挙動が異なるということです。

ここは私には理解できませんので申し訳ありませんがスルーさせていただきます。


>解決策はいくつか考えられますが、私なら次のようにします。

>osascript "${HOME}/Library/Scripts/Music Player.scpt" 1 1 1 'fiesta*chick'

パラメータをシングルクォーテーションで囲む”という解釈でよろしいでしょうか?

試してみましたら、うまく動作しました。


どうもありがとうございました。



2023/01/04 21:00 Pajerow への返信

パラメータをシングルクォーテーションで囲む”という解釈でよろしいでしょうか?


引数にシングルコーテーションが入ってなければそれでほぼ大丈夫。シングルコーテーションが入ってる場合はちょっと面倒で、クォートを一度閉じて「'」を「\'」とすると良いです。


It's a Small World

'It'\''s a Small World'


エスケープすべき文字は「*」や「'」の他にもありますが、それらの文字もこの方法 (シングルコーテーションで括る方法) でほぼ大丈夫です。

2023/01/04 21:12 Hiro__S への返信

アドバイスありがとうございます。


>エスケープすべき文字は「*」や「'」の他にもありますが、それらの文字もこの方法 (シングルコーテーションで括る方法) でほぼ大丈夫です。

使用する特殊文字は基本的に"*"と"+"(アスタリスクとプラス)だけなのでこの方法がわかりやすくていいですね。



このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

ターミナルからAppleScriptファイルを実行したときの動作に関して

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。