Aprire un terminale per lo script bash corrente, se non è stato avviato in uno


2

Come posso far sì che uno script si riavvii da solo in una finestra di Terminale se non è stato avviato in uno?

Basato su questa domanda , Ci ho provato, in un file chiamato testterm marcato eseguibile:

#! /bin/sh
if [ -t 0 ];  # stdin
then
    echo "yay! terminal!"
else
    Terminal sh ~/Desktop/testterm
fi

... ma di Haiku Terminal si apre e non mostra mai nulla, a volte si apre e se ne va immediatamente.

Dal Terminale se scrivo Terminal sh ~/Desktop/testterm funziona una volta, aprendo un terminale con "yay! terminal!" in esso, ma poi i successivi tentativi producono Terminali vuoti.


1
Non chiamare il tuo file test come probabilmente stai chiamando il sistema /usr/bin/test.
slhck

Grazie, non ci avevo pensato. Modificato la domanda (Ancora non funziona, ma almeno so che non è a causa di un conflitto di denominazione questa volta.)
Kev

1
Il test funziona? Sostituire Terminal con un altro comando, è eseguito correttamente?
terdon

1
Non so davvero molto di Haiku, ma ecco cosa proverei: 1. Rimuovi lo spazio tra lo shebang e /bin/sh. 2. Utilizzare un percorso relativo o assoluto per testterm. 3. Prova ad eseguire Terminal testterm & da un terminale. Tutti gli emulatori di terminale con cui ho lavorato richiedono uno switch prima dell'eseguibile (ad es. xterm -e ./testterm ).
Dennis

1
assumendo Terminal funziona come xterm, il file che sta cercando è la shell che deve essere eseguita. Se è così, posso pensare a una soluzione alternativa. Prova a correre Terminal sh, usa sh invece di bash?
terdon

Risposte:


1

Un trucco che potresti provare è il seguente:

  1. Crea uno speciale bash File .rc che fornisce il tuo bashrc e gestisce il tuo script. Lo chiamiamo ~/foo.rc

    $ cat ~/foo.rc
    #!/bin/sh
    ~/Desktop/testterm
    
  2. Crea una nuova "shell" che chiama bash con ~/foo.rc come il suo file .rc. Salva questo script come fake_shell da qualche parte nel tuo $PATH (per esempio, ~/config/bin ) e renderlo eseguibile:

  3. Ora, nel tuo testterm sceneggiatura, lancio Terminal utilizzando fake_shell come la shell.

La sceneggiatura diventa:

#!/bin/sh
if [ ! -t 0 ];  # stdin
then
    TIMESTAMP=`date +%Y%m%d%H%M`
    echo "#!/bin/sh
    source /boot/common/etc/profile
    $0" > ~/temp_term$TIMESTAMP.rc
    echo "#!/bin/sh
    bash --rcfile ~/temp_term$TIMESTAMP.rc" > ~/config/bin/temp_shell$TIMESTAMP
    chmod a+x ~/config/bin/temp_shell$TIMESTAMP
    Terminal temp_shell$TIMESTAMP
    rm -f ~/config/bin/temp_shell$TIMESTAMP
    rm -f ~/temp_term$TIMESTAMP.rc
fi

echo "yay! terminal!"
# your script here
exit

@ Kev, guarda la mia risposta aggiornata per un trucco che puoi provare.
terdon

Eccezionale! Il 99% del modo lì, che è tutto ciò di cui ho bisogno. Un paio di cose, il prompt nella nuova finestra è bash-4.0# invece di /> (non importa) e quando vai a chiudere la finestra, dice, The process "bash" is still running. If you close the Terminal, the process will be killed. (I terminali normalmente si chiudono, ma non è un grosso problema.)
Kev

@ Kev, il prompt può essere modificato impostando il PS1 variabile in foo.rc, la ragione per cui è diverso è perché /etc/bash.bashrc non viene letto, quindi puoi anche risolvere il problema acquistandolo foo.rc. Per quanto riguarda l'errore, è perché si sta avviando esplicitamente /bin/bash. Prova ad avviare in background ( &, anche se dubito che funzionerà).
terdon

Il & rende il terminale nuovamente vuoto, anche se questa è la sintassi corretta per i comandi asincroni in Haiku. Grazie per il suggerimento PS1, cercherò di farlo. BTW non sono sicuro del motivo per cui la mia modifica è risultata divertente ...
Kev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.