Ho scritto un piccolo script di servizio per aprire una finestra terminale iTerm su una cartella arbitraria su Finder.
Voglio controllare se iTerm è in esecuzione e se deve aprire la sessione del terminale in una nuova scheda anziché su una esistente.
Lo script va in questo modo:
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
Il problema è che quando eseguo lo script come servizio, si comporterà sempre come se iTerm fosse già in esecuzione (visualizzando la notifica "in esecuzione"), anche se iTerm è chiuso e NON funziona in modo molto chiaro.
Ma se incollo lo script nello Script Editor (impostando cdPath su un valore letterale, come set cdPath to "cd /etc"
) ed eseguirlo direttamente, funzionerà correttamente, aprendo una nuova istanza iTerm o riutilizzando uno esistente e creando un nuovo scheda e visualizza le notifiche corrispondenti.
Cosa sta succedendo qui? Perché eseguire lo script come servizio potrebbe rilevare l'applicazione come eseguita indipendentemente da cosa?
Aggiorna
Se semplifico lo script semplicemente visualizzando le notifiche in questo modo:
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
Si comporterà come previsto (visualizzando "in esecuzione" o "non in esecuzione" di conseguenza).
Ma se aggiungo la parte "tell application", passerà sempre attraverso il ramo "running", a prescindere da cosa.
Ad es .:
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
Aprirà sempre iTerm (anche se tell application "iTerm"
è sul ramo "non in esecuzione", ma visualizza la notifica "in esecuzione", dal ramo "è in esecuzione" ... La semplice presenza di un "tell applicazione" attiverà l'apertura dell'app, quindi il servizio verrà eseguito.
C'è un modo per aggirare questo?
Grazie e saluti.