Yo escribí un pequeño script de servicio para abrir un iTerm ventana de terminal en cualquier carpeta en el Finder.
Quiero comprobar si iTerm se está ejecutando, y si es para abrir la sesión de terminal server en una nueva pestaña en lugar de en una existente.
El guión va como esto:
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 comportan como si iTerm ya se estaba ejecutando (mostrar la "ejecución" de la notificación), incluso si iTerm es cerrado y muy claramente NO se ejecuta.
Pero si puedo pegar el mismo script en el Editor de secuencias de Comandos (configuración de cdPath literal, como set cdPath to "cd /etc"
) y ejecutarlo directamente funcionará correctamente, ya sea la apertura de una nueva iTerm instancia o la reutilización de una existente y crear una nueva pestaña, y mostrar las notificaciones correspondientes.
¿Qué está pasando aquí? Por qué la ejecución de la secuencia de comandos como un servicio detectar la aplicación ejecuta no importa qué?
Actualización
Si me simplificar la secuencia de comandos para mostrar las notificaciones como esta:
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
Va a comportarse como se espera (mostrar 'running' o 'no se ejecuta' en consecuencia).
Pero si puedo añadir el "tell " aplicación" de la parte, siempre se vaya a través de la "ejecución" de la rama, no importa qué.
E. g.:
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 abierto iTerm (incluso si el tell application "iTerm"
está en el "no funciona" en la rama, pero la pantalla de la "ejecución" de la notificación, de la "ejecución" de la rama... La mera presencia de un "informe de aplicación" supondrá la apertura de la aplicación a continuación, se ejecute el Servicio.
Hay una forma de evitar esto?
Gracias y saludos.