macOS SonomaのShortcuts.appでShell Scriptを実行できない現象への対策
以下の記事の受け売りです。
現象
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で導入できると思います。
clang -o run run.c
このrun
を経由して実行したいスクリプトを実行すれば、“Operation not permitted”エラーを回避できます。ただし、初回実行のみOSのパーミッション許可のダイアログが表示されるので、その許可が必要です。
ショートカットのShell Scriptではrun
経由でスクリプトを実行するようにしましょう。
/path/to/run /usr/local/bin/MySuperUsefulScript.sh $1
※実行したいスクリプトにはあらかじめ実行権限を与えておく必要があります。
ショートカット実装例:
ここではrun
ではなくrunscript4shortcuts
と名付けて、それを/usr/local/binに配置しています。/usr/local/bin/h264mp4
が実行コマンド、"${arg}"
が引数(ショートカットに入力されたファイルパスの一つ)です。このショートカットは複数個の入力を取るので、入力$@
をfor-loopして都度arg
に取り出して利用しています。
関連
Discussion