Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check in AppleScript if an app is running, without launching it - via osascript utility

Consider the following AppleScript:

on is_running(appName)     tell application "System Events" to (name of processes) contains appName end is_running  set safRunning to is_running("Safari") if safRunning then     tell application "Safari"       -- Stuff I only want executed if Safari is running goes here.     end tell     return "Running" else     return "Not running" end if 

The problem: when I run this via the osascript command line utility, if Safari is not running, it gets launched and the script reports "Running". This is not the behaviour I desire or would expect. Note that it works as desired/expected when run within AppleScript Editor.

Is this an osascript bug / known issue? Or is it somehow intended behaviour for reasons I'm missing? Can anyone get it to work as desired? (BTW I'm running OSX 10.7.5; I can't see how to get osascript to report a version number).

If you comment out the tell / end tell lines, it behaves as I'd expect: if Safari is not running, it doesn't launch it, and prints "Not running". So it seems to me like the tell is what's causing Safari to be launched, but it doesn't need to be actually executed, just present in the script...? For a while I wondered if maybe this was just how tell is supposed to work, but since it doesn't work like this in AppleScript Editor, I guess not...

In fact, here's another, madder, version with similar behaviour:

on is_running(appName)     tell application "System Events" to (name of processes) contains appName end is_running  set safRunning to is_running("Safari") return safRunning if false then     tell application "Safari"     end tell end if 

This still always launches Safari, even though tell is inside an if false block after the return statement! (But again, this is fine in AppleScript Editor.)

BTW, this behaviour isn't limited to Safari, but it also isn't universal:

  • Affected apps include: Safari, TextEdit, iPhoto, AppleScript Editor, iTerm, ...
  • Non-affected apps include: Google Chrome, iTunes, Preview, Mail, Terminal, Address Book, Echofon, ...

So, does anyone have any ideas about how I might fix or route around this? Is it an osascript bug? Or am I missing something about AppleScript's semantics?

For context: I'm trying to write a script (to be embedded/called from some python) which queries open browsers for the URLs of any tabs they have open; I've got it all working fine except that it always launches Safari, whether it's open or not. I've boiled down that undesirable behaviour to the simple test case shown above. I'm not aware of any way to run this script from python without using osascript, other than appscript, which I don't want to use because it's no longer developed/supported/recommended.

Many thanks for all inputs / insights!

like image 940
gimboland Avatar asked Apr 17 '13 16:04

gimboland


People also ask

How do I stop AppleScript from running?

All replies. Depending on what the script is doing, pressing command-period will cancel it.


1 Answers

I suspect the reason you are getting this is because each time you call the script from the command line with osascript the script is being compiled.

The act of compiling on a tell application will afaik make the app launch.

Calling the script from the command line with osascript from a pre-compiled file i.e .scpt does not cause this behaviour because the is no compiling to be done.

But calling it from a plain text (.txt,.sh ) file will so the app will launch.

If you do not want to use a .scpt file and want to use a plain text file then you could try the trick of putting a run script command in the applescript.

on is_running(appName)     tell application "System Events" to (name of processes) contains appName end is_running  set safRunning to is_running("Safari") if safRunning then     run script "tell application \"Safari\"       open location \"http://google.com\"           end tell"     return "Running" else     return "Not running" end if 

The script in the run script is only compiled when needed. You will need to escape any characters like quotes as in my example.

It will be easier if you write the script in a normal applescript document first and compiled it to check for errors.

Then copy it to the plain text file.


UPDATE **

The method I used above was from a old script I had used to solved this issue a while before I answered here.

The answer works and is not trying to be elegant. ;-)

I actually like user1804762 method below. As it does work but feel the Answer is not clear enough so I will give an example on using it.

set appName to "Safari"  if application appName is running then          tell application id (id of application appName)                  open location "http://google.com"     end tell     return "Running" else     return "Not running" end if 

This script can be run from the command line with osascript

example:

osascript /Users/USERNAME/Desktop/foo.scpt

Notice that the script is saved as a compiled script. This will work ok and you can also save and use it as a plain text script.

i.e.

osascript /Users/USERNAME/Desktop/foo.applescript

like image 96
markhunte Avatar answered Sep 20 '22 08:09

markhunte