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

Uso BBEdit para escribir y probar secuencias de comandos de Python, y generalmente ejecuto las secuencias de comandos en un proceso de terminal, con el comando "Ejecutar en terminal". ¿Hay alguna manera de que el proceso de terminal abierto por BBEdit permanezca "activo" después de que se complete el script? quisiera no tener la

[Process completed] 

mensaje y, en su lugar, seguir teniendo un indicador activo, ya sea el shell o el entorno de Python, con todas las variables que he creado en el script aún existentes. Esto sería similar a la situación cuando ejecuto 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 sale el script, todavía tengo el proceso activo en la ventana de la terminal.

Simplemente agregue un & al final del comando para ejecutarlo.
Soy consciente del uso de &. Pero estoy ejecutando el script mientras estoy en BBEdit. BBEdit tiene un comando de menú (vea el menú #! ("sebang")) que "envía" el script actual a la terminal y lo ejecuta. Para que esta respuesta sea útil, necesitaría saber cómo modificar el comportamiento de este comando de menú BBEdit y agregar un "&" predeterminado al final del comando.
¿Se ha puesto en contacto con el soporte de BareBones en support@barebones.com? Es posible que tengan métodos para que usted logre esto.

Respuestas (5)

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

secuencia de comandos de Python

Usted elige probar el código usando la opción "Ejecutar en Terminal" del '#!' menú.

Ejecutar en Terminal

Ahora se abre una ventana de Terminal, ejecuta el script y sale.

código de salida

Ahora aquí está el culpable. BBEdit no solo ejecuta su script, sino que también agrega un archivo exit. No hay ninguna opción en BBEdit para eliminar este exitcomando. Pero BBEdit es altamente programable y hay algunas soluciones. Puede crear un Script BBEdit (desde el menú Scripts) que se ejecuta, pero personalmente creo que crear un Servicio es el más fácil (ejecute AppleScript que abre su script en la Terminal como lo habría hecho manualmente).

En este tratamiento, ha proporcionado un script que realmente hace lo que quiere.

Hola CousinCocaine, que tú! ¡Esto parece lo correcto para mí! Déjame probar esto y te concederé la recompensa. Dado que no estoy familiarizado con los scripts/servicios de Apple, ¿sería posible asociar el servicio a un atajo de teclado? Y en el caso de que no sea posible, ¿sería complicado convertir esto en un guión? (En ese caso creo recordar que es fácil asociar un atajo a un script)
Hola CousinCocaine, he jugado con tu código, siguiendo parcialmente las instrucciones que se encuentran aquí: arstechnica.com/gadgets/2011/03/… Pero no puedo verlo en el menú de servicios, aunque está guardado en ~/Library/Services . También lo guardé como script (archivo de texto, con extensión .sh, en ~/Library/Application\ Support/BBEdit/Scripts/ ) pero me da el siguiente error: 83:84: error de sintaxis: Esperado “,” pero encontrado “"”. (-2741) El archivo /Users/fabio/Library/Application Support/BBEdit/Scripts/python no existe. ¿Ideas?

Basándome en la respuesta de CousinCocaine , y en esta respuesta a una vieja pregunta que publiqué yo mismo en el foro de BBEdit, llegué 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

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

Encuentro esta respuesta mejor que la propuesta por CousinCocaine solo porque puedo crear un atajo de teclado para el script (AFAIK, no es posible asociar un atajo a un servicio).

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

  1. Copie el código del script en Script Editor.app (que se encuentra en la carpeta /Applications/Utilities/)
  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 y atajos -> Scripts (tiene que hacer clic a la derecha del nombre del script, donde dice "ninguno", y presionar su atajo)

Aquí hay una captura de pantalla del panel de preferencias.

  1. Finalmente, crea una secuencia de comandos en BBEdit, por ejemplo, una secuencia de comandos de python, la guarda y, si bien es la ventana frontal en BBEdit, selecciona AppleScript en el menú de secuencias de comandos de BBEdit. Esto enviará la secuencia de comandos de python a la Terminal y se ejecutará la secuencia de comandos.

Acerca de AppleSript, observe que la opción "-i" en la llamada de python en la línea

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

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

si las lineas

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

son reemplazadas por las líneas

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

entonces este AppleScript puede iniciar cualquier secuencia de comandos, siempre que la línea "shebang" correcta esté presente en la secuencia de comandos, como la primera línea. Para un script de python, la línea shebang debería ser:

#!/usr/bin/env python

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

#!/bin/bash
Veo que lo has hecho. Lindo. BBEdit una buena pieza de software. Codificación feliz.
$ python script_name.py &

Esto ejecutará el proceso en segundo plano.

Alternativamente, puede probar las respuestas aquí por las cuales no tomo el crédito.

Soy consciente del uso de &. Pero estoy ejecutando el script mientras estoy en BBEdit. BBEdit tiene un comando de menú (vea el menú #! ("sebang")) que "envía" el script actual a la terminal y lo ejecuta. Para que esta respuesta sea útil, necesitaría saber cómo modificar el comportamiento de este comando de menú BBEdit y agregar un "&" predeterminado al final del comando.
¿Podría llamar a un script de shell que ejecute su python y lo coloque en segundo plano?
¿Desde BBEdit? Tal vez sí, pero ¿cómo se hace eso?
El OP tiene una pregunta específica sobre la ejecución de secuencias de comandos desde BBEdit. No es un comando Bash específico. Creo que una respuesta correcta a otra pregunta.

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

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

Entonces, en lugar de ejecutar en la 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á abriendo nuevas ventanas de terminal todo el tiempo.

Direcciones aquí:

https://stackoverflow.com/questions/24573584/how-to-watch-file-changes-on-mac-osx-using-fswatch

En las preferencias de Terminal, en Perfiles, seleccione el perfil que usa de forma predeterminada y vaya a la pestaña Shell. En "Cuando el shell salga", seleccione "Cerrar si el shell salió limpiamente".

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

Gracias por la información. Sin embargo, esto es completamente diferente de lo que necesito. Necesito la terminal abierta y activa :)