Evita la chiusura del processo terminale, dopo che BBEdit esegue uno script

5

Uso BBEdit per scrivere e testare gli script Python e di solito eseguo gli script in un processo terminale, con il comando "Esegui in terminale". C'è un modo per far aprire il processo del terminale da BBEdit rimanere "attivo", dopo che lo script è stato completato? Mi piacerebbe non avere il

[Process completed] 

e invece di avere ancora un prompt attivo, la shell o l'ambiente Python, con tutte le variabili che ho creato nello script ancora esistenti. Questo sarebbe simile alla situazione in cui lancio lo script da un processo terminale esistente, o dalla shell:

$ python script_name.py

o dall'interprete python:

>>> script_name.py

In particolare, nell'ultimo caso, quando lo script termina, ho ancora il processo attivo nella finestra del terminale.

    
posta Fabio 18.08.2017 - 04:15
fonte

5 risposte

2

Basarsi sulla risposta di CousinCocaine e su questa risposta a una vecchia domanda che ho postato sul forum BBEdit, sono arrivato a questo AppleScript, che è specifico per 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

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

Trovo questa risposta migliore di quella proposta da CousinCocaine solo perché posso creare una scorciatoia da tastiera per lo script (AFAIK non è possibile associare un collegamento a un servizio).

I passi da seguire per farlo funzionare sono i seguenti:

  1. Copia il codice dello script in Script Editor.app (che si trova nella cartella / Applicazioni / Utility /)
  2. Compilare lo script (icona martello sulla barra dell'Editor)
  3. Salvalo nella cartella degli script di BBEdit: / Users // Library / Application \ Support / BBEdit / Scripts /
  4. Opzionale In BBEdit associare lo script a una scorciatoia da tastiera, in Preferenze - > Menu e amp; Scorciatoie - > Script (devi fare clic a destra del nome dello script, dove dice "none" e premere il tuo collegamento)

  • Infine, si crea uno script in BBEdit, ad es. uno script python, lo salvi e mentre è la finestra frontale in BBEdit, selezioni AppleScript dal menu Script di BBEdit. Questo invierà lo script python al terminale e lo script verrà eseguito.
  • Informazioni su AppleSript, si noti che l'opzione "-i" nella chiamata python nella riga

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

    fa in modo che dopo l'esecuzione dello script python, l'interprete python non sia uscito, come da richiesta nella domanda.

    Se le linee

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

    sono sostituiti dalle linee

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

    allora questo AppleScript può lanciare qualsiasi script, a condizione che la linea "shebang" sia presente nello script, come prima linea. Per uno script python, la riga shebang dovrebbe essere:

    #!/usr/bin/env python
    

    mentre per uno script di shell bash la riga di shebang dovrebbe essere:

    #!/bin/bash
    
        
    risposta data 04.10.2017 - 15:00
    fonte
    5

    Come ho capito, hai uno script Python in BBEdit.

    Haisceltoditestareilcodiceusandol'opzione"Esegui in terminale" da "#!" menu.

    OrasiapreunafinestradiTerminale,esegueloscriptedesce.

    Oraeccoilcolpevole.BBEditnoneseguesololoscript,maaggiungeancheunexit.Nonc'èalcunaopzioneinBBEditperrimuoverequestocomandoexit.MaBBEditèaltamentescriptableecisonoalcunimetodialternativi.PuoicreareunoscriptBBEdit(dalmenuScripts)chevieneeseguito,mapersonalmentepensochecreareilserviziosiailpiùsemplice(eseguiunAppleScriptcheapreloscriptnelterminalecomeavrestifattomanualmente).

    Inquestotrattamentohaifornitouno script che fa effettivamente ciò che desideri.

        
    risposta data 01.10.2017 - 08:44
    fonte
    2
    $ python script_name.py &
    

    Questo eseguirà il processo in background.

    In alternativa puoi provare le risposte qui per cui non prendo il merito

        
    risposta data 29.09.2017 - 04:55
    fonte
    2

    Questo non è esattamente ciò che desideri, ma è una soluzione ragionevole:

    FSWatch. In breve, monitora una directory o un file per le modifiche ed esegue uno script ogni volta che vede una modifica.

    Quindi, anziché eseguire il terminale, è aperta una finestra di terminale con fswatch che guarda i file per le modifiche. Quando ne vede uno, esegue lo script, in questo caso il file che sta guardando.

    Questo ha il vantaggio che viene eseguito ogni volta nella stessa finestra, quindi non stai saltando su nuove finestre di terminale tutte le volte.

    Indicazioni qui:

    link

        
    risposta data 03.10.2017 - 00:38
    fonte
    0

    Nelle preferenze di Terminale sotto Profili, seleziona il profilo che usi per impostazione predefinita e vai alla scheda Shell. Sotto "Alla chiusura della shell" seleziona "Chiudi se la shell è stata chiusa correttamente".

    Questo dovrebbe rendere la finestra / scheda chiusa quando lo script che si esegue si chiude in modo pulito.

        
    risposta data 29.09.2017 - 05:36
    fonte

    Leggi altre domande sui tag