Escribí una pequeña secuencia de comandos de servicio para abrir una ventana de terminal iTerm en una carpeta arbitraria en el Finder.
Quiero que compruebe si iTerm se está ejecutando y si es para abrir la sesión de terminal en una nueva pestaña en lugar de en una existente.
El script es así:
on run {input, parameters}
set cdPath to "cd " & (quoted form of POSIX path of (input as string))
if application "iTerm" is running then
display notification "running"
tell application "iTerm"
set termWin to (current terminal)
tell termWin
launch session "Default"
tell the last session
write text cdPath
end tell
end tell
end tell
else
display notification "not running"
tell application "iTerm"
activate
set termWin2 to (current terminal)
tell termWin2
tell the last session
write text cdPath
end tell
end tell
end tell
end if
return input
end run
El problema es que cuando ejecuto el script como un servicio, siempre se comportará como si iTerm ya se estuviera ejecutando (mostrando la notificación "en ejecución"), incluso si iTerm está cerrado y muy claramente NO se está ejecutando.
Pero si pego la misma secuencia de comandos en el Editor de secuencias de comandos (configurando cdPath en un literal, como set cdPath to "cd /etc"
) y lo ejecuto directamente, funcionará correctamente, ya sea abriendo una nueva instancia de iTerm o reutilizando una existente y creando una nueva y visualice las notificaciones correspondientes.
¿Qué está pasando aquí? ¿Por qué ejecutar el script como un servicio detectaría que la aplicación se está ejecutando sin importar qué?
Actualizar
Si simplifico el script para mostrar solo las notificaciones de esta manera:
on run {input, parameters}
set cdPath to "cd " & (quoted form of POSIX path of (input as string))
if application "iTerm" is running then
display notification "running"
else
display notification "not running"
end if
return input
end run
Se comportará como se espera (mostrando "en ejecución" o "no en ejecución" en consecuencia).
Pero si agrego la parte "tell application", siempre pasará por la rama "running", pase lo que pase.
Por ejemplo:
on run {input, parameters}
set cdPath to "cd " & (quoted form of POSIX path of (input as string))
if application "iTerm" is running then
display notification "running"
else
display notification "not running"
tell application "iTerm"
activate
end tell
end if
return input
end run
Siempre abrirá iTerm (incluso si tell application "iTerm"
está en la rama "no se está ejecutando", pero muestra la notificación "en ejecución", desde la rama "se está ejecutando" ... La mera presencia de una "aplicación dice" activará la apertura de la aplicación y, a continuación, se ejecutará el Servicio.
¿Hay una manera de eludir esto?
Gracias y saludos.