🐰

macOS SonomaのShortcuts.appでShell Scriptを実行できない現象への対策

2023/10/08に公開

以下の記事の受け売りです。

https://www.reddit.com/r/shortcuts/comments/16tmm6r/sonoma_shell_script_now_errors_out/

現象

macOSに付属のShortcuts.appではShell Scriptを実行することができます。ショートカットをメニューバーやクイックアクションメニュー(コンテクストメニュー)に登録しておくと、よく行うコマンドラインの操作をGUIからもサッと呼び出せるため非常に便利です。例えばFinderで選択したファイルを入力にして実行するような処理を、コンテクストメニューからも行えるようになります。

しかしmacOS 14.0 Sonomaにアップグレードしてからはこのショートカット活用法が一部使えなくなってしまいました。例えば/usr/local/bin/以下に置いておいた自作スクリプトを実行するようなショートカットです。今までこれで機能していたショートカットをSonoma環境(14.0)で実行すると、“Operation not permitted”と操作権限がないとエラーが出てしまうのです。siriactionsdプロセスなどにフルディスクアクセス権を与えてみてもダメだったのですが、冒頭で紹介したRedditに対処方法が投稿されていたのでその方法を記しておきます。

対処方法

スクリプトを実行するためだけのプロキシー役プログラムを間に挟むことで、この現象を回避することができます。

まず以下のCコードを適当なテキストエディタに記して、run.cとでも名付けて保存します。

#include <unistd.h>

int main(int argc, char*const* argv, char*const* envp) {
  if (argc < 2) return -1;
  return execve(argv[1], argv + 1, envp);
}

次にこのCファイルをコンパイルして実行可能プログラムにします。以下のコマンドではrunという名前のプログラムに書き出していますが、適宜名前は変えても構いません。clangはXcodeのCommand Line Toolsで導入できると思います。

Cコードをコンパイルして実行可能ファイルを生成
clang -o run run.c

このrunを経由して実行したいスクリプトを実行すれば、“Operation not permitted”エラーを回避できます。ただし、初回実行のみOSのパーミッション許可のダイアログが表示されるので、その許可が必要です。

ショートカットのShell Scriptではrun経由でスクリプトを実行するようにしましょう。

ショートカットのShellScript記入例
/path/to/run /usr/local/bin/MySuperUsefulScript.sh $1

※実行したいスクリプトにはあらかじめ実行権限を与えておく必要があります。

ショートカット実装例:

ここではrunではなくrunscript4shortcutsと名付けて、それを/usr/local/binに配置しています。/usr/local/bin/h264mp4が実行コマンド、"${arg}"が引数(ショートカットに入力されたファイルパスの一つ)です。このショートカットは複数個の入力を取るので、入力$@をfor-loopして都度argに取り出して利用しています。

関連

https://zenn.dev/usagimaru/articles/1567803a51e812

Discussion