Evite que el proceso de terminal se cierre, después de que BBEdit ejecute un script

5

Utilizo BBEdit para escribir y probar scripts de Python, y normalmente ejecuto los scripts en un proceso de terminal, con el comando "Ejecutar en el terminal". ¿Hay alguna manera de que el proceso de terminal abierto por BBEdit permanezca "activo", después de que se complete el script? Me gustaría no tener el

[Process completed] 

y, en su lugar, seguir teniendo un indicador activo, ya sea el shell o el entorno Python, con todas las variables que he creado en el script que aún existen. Esto sería similar a la situación cuando lanzo el script desde un proceso de terminal existente, ya sea desde el shell:

$ python script_name.py

o desde el intérprete de python:

>>> script_name.py

En particular, en el último caso, cuando el script se cierra, todavía tengo el proceso activo en la ventana del terminal.

    
pregunta Fabio 18.08.2017 - 04:15

5 respuestas

2

Aprovechando la respuesta de CousinCocaine , y en esta respuesta a una vieja pregunta que me publiqué en el foro de BBEdit, he venido a este AppleScript, que es específico para Python:

-------------------------------------------------------------------------------------------
# Auth: Christopher Stone
# modif Fabio Grazioso
# dCre: 2015/09/22 11:00
# dMod: 2017/10/03 18:40 
# Appl: BBEdit, Terminal
# Task: Attempt to run the front text document in Terminal.app.
# Libs: None
# Osax: None
# Tags: @Applescript, @Script, @BBEdit, @Run, @Front, @Document, @Terminal, @Python
-------------------------------------------------------------------------------------------

tell application "BBEdit"
    tell front text document
        if on disk = false then error "Front document is not saved!"
        if modified = true then save
        if contents of line 1 does not start with "#!" then error "No valid shebang line found!"
        set docName to its name
        set docFile to POSIX path of (get its file)
    end tell
end tell

set shCMD to text 2 thru -1 of "
FILE=" & docFile & ";
if [[ ! -x \"$FILE\" ]]; then
  chmod +x \"$FILE\";
fi
"
do shell script shCMD

set {oldTIDS, AppleScript's text item delimiters} to {AppleScript's text item delimiters, "/"}
set docName to quoted form of docName
set docParentPath to quoted form of ((text items 1 thru -2 of docFile) as text)
set AppleScript's text item delimiters to oldTIDS

tell application "Terminal"
    activate
    if name of windows = {missing value} then do script
    if processes of front window = {} then do script


    tell front window
        if its busy = true then
            do script "cd " & docParentPath & " && python -i " & docName
        else
            do script "cd " & docParentPath & " && python -i " & docName in selected tab
        end if
    end tell
end tell

-------------------------------------------------------------------------------------------

Considero que esta respuesta es mejor que la propuesta por CousinCocaine solo porque puedo crear un método abreviado de teclado para el script (AFAIK no es posible asociar un método abreviado a un servicio).

Los pasos a seguir para que esto funcione son los siguientes:

  1. Copie el código del script en el Script Editor.app (que se encuentra en la carpeta / Aplicaciones / Utilidades /)
  2. Compile el script (icono de martillo en la barra del Editor)
  3. Guárdelo en la carpeta de scripts de BBEdit: / Users // Library / Application \ Support / BBEdit / Scripts /
  4. Opcional En BBEdit, asocie el script a un atajo de teclado, en Preferencias - > Menús & Accesos directos - > Secuencias de comandos (debe hacer clic a la derecha del nombre de la secuencia de comandos, donde dice "ninguno", y presionar su acceso directo)

  • Finalmente, creas un script en BBEdit, por ejemplo. una secuencia de comandos de python, la guardas y, si bien es la ventana frontal en BBEdit, seleccionas el AppleScript del menú Scripts de BBEdit. Esto enviará la secuencia de comandos de Python a la Terminal y la secuencia de comandos se ejecutará.
  • Acerca de AppleSript, observe que la opción "-i" en la llamada a python en la línea

    do script "cd " & docParentPath & " && python -i " & docName
    

    hace que después de la ejecución del script de python, el intérprete de python no salga, según la solicitud en la pregunta.

    Si las líneas

    do script "cd " & docParentPath & " && python -i " & docName
    do script "cd " & docParentPath & " && python -i " & docName in selected tab
    

    son reemplazados por las líneas

    do script "cd " & docParentPath & " && ./" & docName
    do script "cd " & docParentPath & " && ./" & docName in selected tab
    

    entonces este AppleScript puede lanzar cualquier script, siempre que la línea "shebang" correcta esté presente en el script, como la primera línea. Para un script de python, la línea shebang debe ser:

    #!/usr/bin/env python
    

    mientras que para un script de shell bash la línea shebang debería ser:

    #!/bin/bash
    
        
    respondido por el Fabio 04.10.2017 - 15:00
    5

    Según tengo entendido, tienes un script de Python en BBEdit.

    Eligesprobarelcódigousandolaopción"Ejecutar en Terminal" del '#!' menú.

    AhoraseabreunaventanadeTerminal,ejecutaelscriptysale.

    Ahoraaquíestáelculpable.BBEditnosoloejecutasuscript,sinoquetambiénagregaunexit.NohayningunaopciónenBBEditparaeliminarestecomandoexit.PeroBBEditesaltamenteprogramableyhayalgunassoluciones.PuedecrearunscriptBBEdit(desdeelmenúScripts)queseejecuta,peropersonalmentecreoquecrearelServicioeselmásfácil(ejecutealgodeAppleScriptqueabrasuscriptenlaTerminalcomolohubierahechomanualmente).

    Enestetratamiento,haproporcionadoun secuencia de comandos que realmente hace lo que usted quiere.

        
    respondido por el CousinCocaine 01.10.2017 - 08:44
    2
    $ python script_name.py &
    

    Esto ejecutará el proceso en segundo plano.

    Alternativamente, puedes probar las respuestas aquí por lo cual no tomo el crédito

        
    respondido por el bated 29.09.2017 - 04:55
    2

    Esto no es exactamente lo que quiere, pero es una solución razonable:

    FSWatch. Brevemente, supervisa un directorio o archivo en busca de cambios, y ejecuta un script cada vez que ve un cambio.

    Entonces, en lugar de ejecutarse en el terminal, tiene una ventana de terminal abierta con fswatch observando los archivos en busca de cambios. Cuando ve uno, ejecuta el script, en este caso, el archivo que se está viendo.

    Esto tiene la ventaja de que se ejecuta en la misma ventana cada vez, por lo que no estás abriendo nuevas ventanas de terminal todo el tiempo.

    Direcciones aquí:

    enlace

        
    respondido por el Sherwood Botsford 03.10.2017 - 00:38
    0

    En las preferencias de Terminal en Perfiles, seleccione el perfil que usa de manera predeterminada y vaya a la pestaña Shell. Debajo de "Cuando el shell se cierra", selecciona "Cerrar si el shell se cerró".

    Eso debería hacer que la ventana / pestaña se cierre cuando el script que ejecute salga limpiamente.

        
    respondido por el Scott Earle 29.09.2017 - 05:36

    Lea otras preguntas en las etiquetas