Foltia with AppleScript

Foltia animelockerのトラブルシューティング

do shell scriptでshellを使おう-1:アップルスクリプト

またアップルスクリプトに戻ってきました。 紹介したスクリプトは、do shell scriptを多用してます。 これはUnix-shellコマンドをApplescript上で使うための方法です。Shellに精通している人ですと、foltiaサーバ上でスクリプトを完結されるんじゃないかな・・。 なのでAppleScript上でshellを使う方は両刀使いで少し軸足がMac側にある方でしょうかね。 

私の場合、日々必要に迫られてShell言語を扱うようになったにわかユーザーなので、グーグル先生のアドバイスは欠かせないです。 

Do Shell Scriptのメリットは、本来のアップルスクリプトより文字列の処理(sed grep awk tr)が簡単だったり、高速だったりする点ですかね。 またMacOSにデフォルトでセットされていないShellコマンドもMacPortsやHomeBrewで追加インストールして使用することも可能になります。

さてアップルスクリプトでdo shell scriptを使う際の注意点を、Unix nativeとの違いを中心に、少しおさらいしてみましょう。 今回は長いので2回に分けるつもりです。

改行の違い

MacOSは改行が\r Unixは\nが基本です。do shell scriptで戻ってきたテキストの戻り値も、MacOSの変数に一度格納しちゃうと改行コードは自動的に\rに変換されます。 そのためアップルスクリプト、String型変数データーはshellに戻す際に | tr \\\\r \\\\n とパイプを使って変更しておく必要があります。 それを怠るとgrepコマンドとかが思ったように動作しなくなります。 

またアップルスクリプト上で逆スラッシュ(\)はエスケープ文字になっていてそれをエスケープするという手順をとるのですが、Stringに記載する際にもう一回エスケープする必要があるので逆スラッシュが計4個必要になります。 

phpコマンドは今は使えない

古いMacOSにはphpコマンドがプリセットされていましたが、Monterey以降はインストールされていません。 古いApplescriptの記事なんかには平気でphpコマンドを使うみたいに記載されている文章が残ってるので、混乱するかもしれませんね。 phpコマンドは特に日付や日本語環境の全角・半角変換など使いやすいコマンドがいっぱいあるのでどうしても使いたい方は、phpを別途インストールして使ってみるとよいでしょう。 

MacPorts/Homebrewなどで追加したコマンドはパスが通ってない

こういった後付けのコマンドはパスが通ってないので少々工夫が必要ですが、~/.zprofile ファイルにパスが記載されているので(例えばMacPortsなら export PATH="/opt/local/bin:/opt/local/sbin:$PATH”)それを読み取って、パスを通すのもよいかもしれません。 

まあそれをアップルスクリプトで記載するとこんな感じでしょうかね?  例えばrenameというコマンドは

 

set cmd0 to "rename"

 

set prof to (((path to home folder from user domain) as string) & ".zprofile")'s POSIX path --今はこれ

set prof2 to (((path to home folder from user domain) as string) & ".profile")'s POSIX path --古いOSなら

set path_ to do shell script "cat " & quoted form of prof & "| grep -v '^#' |grep -v '^$' |grep ':'|tr : \\\\n|grep -e '/'|sed 's|^[^/]*/|/|g'||true"

if path_ is "" then set path_ to do shell script "cat " & quoted form of prof2 & "| grep -v '^#' |grep -v '^$' |grep ':'|tr : \\\\n|grep -e '/'|sed 's|^[^/]*/|/|g'||true"

set path_ls to (every paragraph of path_) & {""}

 

 

set cmd1 to ""

repeat with aPath in path_ls

    set aPath to aPath's contents & "/" & cmd0

    set cmd1 to do shell script "which " & quoted form of aPath & "||true"

    if cmd1 is not "" then exit repeat

end repeat

 

return cmd1

-->"/opt/local/bin/rename"

大分長いですね。 これで一応絶対パスが取り出せるはずです。

まあMacを10台ぐらい持ってて、OSが違ったり追加インストールしたときにアプリが違ったりとかが混在しているところで作業するとすると、こういう一般化が必要となるでしょうね。 

ただ1個か2個のマックで作業するなら、個別にTerminal上で which phpとかのコマンドを使うと絶対パスが戻ってくるので、 do shell script “/opt/local/bin/xxxx “といった感じでコマンドを書くときちんと認識してくれるはずです。

~ % which rename

/opt/local/bin/rename

対話式はTerminalを使って動作させる必要がある。

Topやpcsc_scan、recept1などの実行中に占有するタイプの対話式のコマンドはやはりTerminalでウインドウ操作を行って実行する方が良いでしょうね。 後日HandBrakeCLIを使ったEncodeの実践で紹介して見ますね。