2013-09-08 13 views
6

Essendo pigro, vorrei concatenare i seguenti due comandi in modo che funzioni con un semplice alias bash.jekyll serve e lancia

jekyll -w serve 

avvia il server di sviluppo per il mio esempio Jekyll.

open "http://localhost:4000" 

avvia la mia applicazione jekyll nel mio browser predefinito.

Come posso concatenarli insieme in modo da poter digitare un semplice alias nella riga di comando per servire e avviare?

NOTE

  • Nota utilizzando && o ; a catena jekyll -w serve e open "http://localhost:4000" non funzionerà perché la jekyll -w serve lancia il processo webrick persistente stdout. Ciò significa che il 2 ° comando open "http://localhost:4000" non verrà eseguito perché il primo processo (webrick) non è mai stato "completato".

  • Quando webrick inizia, si può vedere un output tipico come segue: -

Configuration file: /Users/calvin/work/calviny/_config.yml 
      Source: /Users/calvin/work/calviny 
     Destination: /Users/calvin/work/calviny/_site 
     Generating... done. 
Auto-regeneration: enabled 
[2013-09-08 18:43:58] INFO WEBrick 1.3.1 
[2013-09-08 18:43:58] INFO ruby 1.9.3 (2013-06-27) [x86_64-darwin11.4.2] 
[2013-09-08 18:43:58] INFO WEBrick::HTTPServer#start: pid=6183 port=4000 
+0

ho chiesto in sostanza, la stessa domanda, e [ecco una soluzione di lavoro] (http: //stackoverflow.com/a/25177206/704015). –

risposta

0

Attualmente vedo le seguenti opzioni:

  • uso expect a avviare jekyll e successivamente sul browser in base a una determinata riga di output da jekyll che mostra che è sicuro avviare il browser ora.

  • scrivere un piccolo programma che tenta in sequenza di connettersi alla porta 4000. Se è possibile stabilire una connessione in un dato momento, è possibile avviare il browser. Ovviamente potresti anche usare wget o curl e provare sequenzialmente l'index.html.

  • è possibile riconoscere che jekyll è pronto in base alla presenza di determinati file. È possibile codificare qualcosa con inotifywait per avviare il browser dopo il un tale file è stato creato. (Ma non so jekyll, non sono sicuro se questo è davvero un'opzione)

+0

Questo è esattamente quello che ho tentato ma non funzionerà perché per "aprire" http: // localhost: 4000 "per eseguire,' jekyll -w serve' deve essere "completato" - che non è più è lanciato e in attesa di ulteriori eventi. –

+0

vuoi dire che jekyll si avvia come un demone? (Non conosco il programma) – hek2mgl

+0

jekyll development server è webrick (ruby on rails utilizza webrick anche come server di sviluppo) e non si sposta sullo sfondo. All'avvio, i risultati vengono visualizzati sullo stdout come un processo persistente. Quindi finché non termino il processo di webrick con un ctrl-c, il secondo comando 'open" http: // localhost: 4000 "' non verrà eseguito. –

1
function jek { 
    jekyll -w serve & open "http://localhost:4000" 
} 

risolve il problema. Un singolo &.

+0

come farà in modo che il server Web sulla porta 4000 venga avviato prima della generazione del browser? In realtà è come avviare il browser prima del comando jekyll (cosa che ho suggerito ~ ora prima) utilizzando questa soluzione sarà necessario aggiornare il browser dopo che il server web è stato avviato – hek2mgl

+0

Hai ragione. Questa soluzione non è abbastanza buona. :-( –

+0

Ho aggiunto un'opzione alla mia risposta: sondare la porta 4000 e avviare il browser se è possibile stabilire una connessione: potresti anche usare wget o curl e provare a caricare - diciamo index.html - instabile di wrinting un piccolo programma per questo – hek2mgl

0

Non sono al 100% sui comandi del terminale, ma questo sembra averlo risolto per me. Testato alcune volte senza problemi. (Sto usando osx 10.8 se fa alcuna differenza per voi)

function jek { 
    jekyll -w serve & sleep 5 && open "http://localhost:4000" 
} 
0

Come hek2mgl suggerito, si può fare questo con expect:

set timeout 5 
spawn jekyll serve 
expect { 
    -re {Server address:\s+(.+)$} { 
     set address $expect_out(1,string) 
    } 
} 
expect "Server running..." 
catch { 
    exec xdg-open $address 
} 
interact