bashスクリプトからAppleScriptを実行する


55

bashスクリプト内からAppleScriptを実行したい場合、実行する必要があるコマンドのリストを含むファイルを呼び出すことができます。

#!/bin/bash
{some commands}
osascript file.scpt
{other commands}

ただし、bash内から順番に実行する必要があるコマンドを実行する場合はどうなりますか?

例は

#!/bin/bash
echo
echo This will open Google Chrome in Kiosk mode
  osascript -e "tell application \"Google Chrome\""
  osascript -e "activate"
  osascript -e     "tell application \"System Events\""
  osascript -e         "key down {command}"
  osascript -e         "key down {shift}"
  osascript -e         "keystroke \"f\""
  osascript -e         "key up {shift}"
  osascript -e         "key up {command}"
  osascript -e     "end tell"
echo "Google Chrome is now open in Kiosk Mode"

私はこれが非常にフェッチされた例であることを知っていますが、私がやろうとしていることを説明するのに役立ちます。通常、これらのコマンドはすべて、それぞれのエスケープ\文字なしですべての場所に記述され"、各コマンドの周りには記述されません。また、それらを.scptファイル内に入れます。

私が知っている解決策は、#!/usr/bin/osascriptbashの代わりにスクリプトを書き換えてそこから進むことですが、ブレンドできるようにしたいです。スクリプトファイルが存在する場合、スクリプトファイルを作成してテストし、必要な各コマンドをそのファイルに追加してから、bash内から必要なスクリプトファイルを実行できることを発見しましたが、これも目的に反します。

ファイルの途中で、使用されているシェルをshebang行と交換し、必要なコマンドを実行した後に元に戻す方法はありませんか?

どんな洞察も歓迎です。

回答:


57

の引数にosascript -eは改行を含めることができます。

osascript -e 'set x to "a"
say x'

複数の-e引数を指定することもできます:

osascript -e 'set x to "a"' -e 'say x'

あなたはヒアドキュメントを使用している場合や、bash(3つの文字解釈し\$、と`)の間<<ENDENDの間ではなく文字なし<<'END'としますEND

osascript <<'END'
set x to "a"
say x
END

編集:

osascriptはheredocで動作する(つまり、/ dev / stdinから入力を取得する)ことができるため、スクリプトをファイル全体として記述し、正しいshebang行を追加することができます。

#!/usr/bin/env osascript

set x to "a"
say x

これにより、次の手順を使用して、スクリプトを実際のプログラムとして〜/ Applications / .appに保存することもできます(スクリプトの名前を変更します)。

mkdir -p ~/Applications/<APP_NAME>.app/Contents/MacOS
touch ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>
open -A TextEdit ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>

... / MacOS /にあるスクリプトファイルと一致するものの両方を確認します


確かにあなたは正しいです。最初end tellのスクリプトを見逃しました。
ダニエル・ジェームズW

-eHEREDOCの例で必要ない理由は何ですか?
iconoclast

@iconoclast osascriptのmanページごとに1行のスクリプトです。-e statement Enter one line of a script. If -e is given, osascript will not look for a filename in the argument list. Multiple -e options may be given to build up a multi-line script. Because most scripts use characters that are special to many shell programs (for example, AppleScript uses single and double quote marks, ``('', ``)'', and ``*''), the statement will have to be correctly quoted and escaped to get it past the shell intact.
宇宙学校

@uchuugaka申し訳ありませんが、あなたの回答が私の質問にどのように答えるかを理解できません。-e statement Enter one line of a scriptあっいる-e存在。しかし、それとは別に、HEREDOCは1行として扱われますか?
iconoclast

21

生のAppleScriptをラップすることができ<<EODます... EOD入力の終わりを示す最後のシグナルは、行の最初の位置に来なければなりません。

(ちなみに、あなたのapplescriptはend tellafter が抜けているように見えましたactivate....)

#!/bin/bash
osascript <<EOD
  tell application "Google Chrome"
      activate
  end tell
  tell application "System Events"
      key down {command}
      key down {shift}
      keystroke "f"
      key up {shift}
      key up {command}
  end tell
EOD

echo "Google Chrome is now open in Kiosk Mode"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.