Search code examples
dockerscriptingapplescriptiterm2

Can I force applescript to run synchronously?


I'm writing a simple applescript script for iTerm2 that generates a bunch of tabs and starts running services within them (I have a lot of microservices, and all need to be running to test things locally).

Things are mostly working, however I'm experiencing some slightly odd behavior which I think is related to applescript sending commands early. Let's look at a concrete example:

create tab with default profile   
tell the current session
  write text "cd services/myservice"
  write text "make build-docker"
  write text "make run-docker"
end tell

In theory, this chunk should

1) Create a new tab 2) Change into a new directory 3) Build a docker image and 4) Run that docker image.

This will occasionally work, but more frequently I run into problems on step 4. Specifically, I'll check the tab only to find out that 'make build-docker' was the last command run. This command takes some time, so I'm assuming "make run-docker" is sent while build is running and is ignored. Is there a way to force applescript/iTerm2 to wait for this command to finish so that run is executed correctly?

Hopefully this is clear. Thanks for reading!


Solution

  • If you have iTerm's shell integration enabled, you can poll is at shell prompt to determine if the command has finished:

    tell application "iTerm2"
      tell current window
        create tab with profile "BentoBox"
        tell current session
            write text "sleep 5"
            repeat while not (is at shell prompt)
               delay 0.5
           end repeat
           write text "sleep 5"
        end tell
      end tell
    end tell
    

    Otherwise, you will want to string all the commands together in one tell:

    write text "cd services/myservice; make build-docker; etc; etc; etc.."
    

    Or place them in a shell script and execute that:

    write text "my_super_duper_shell_script.sh"
    

    Or use AppleScript to write the cmds to a tmp file and execute that:

    re : How can I create or replace a file using Applescript?