Come posso creare uno script che apre le finestre del terminale ed esegue i comandi in esse?


140

Ho tre script che devo eseguire quando avvio la mia macchina Ubuntu, avviano i servizi che utilizzo nel mio ambiente di sviluppo.

Per fare ciò, apro manualmente tre terminali e digito i comandi.

Esiste un modo per creare uno script che aprirà tre terminali ed eseguirà un comando in ciascuno di questi? (Ogni comando dovrebbe essere in una finestra terminale separata in modo che io possa vedere il loro output).

Risposte:


138
gnome-terminal -e command

o

xterm -e command

o

konsole -e command

Abbastanza

terminal -e command

Per fare in modo che il terminale rimanga quando il comando termina:

A Konsole c'è una --noclosebandiera.

In xterm, c'è una -holdbandiera.

In gnome-terminal, vai su Modifica -> Preferenze profilo -> Titolo . Fai clic sulla scheda Comando . Selezionare Mantieni il terminale dal menu a discesa con l'etichetta Quando il comando termina . È necessario creare un nuovo profilo per quello ed eseguire con

gnome-terminal --window-with-profile = NAMEOFTHEPROFILE -e comando

1
Se provo a tenere il terminale, ottengo "il processo figlio è uscito normalmente con il codice di stato 127"
Darshan Chaudhary,

2
gnome-terminal non ha più l'opzione del titolo :(
törzsmókus

1
@ törzsmókus è davvero il 2017! Le versioni LTS hanno una durata di supporto di 5 anni. 14.04 non termina fino ad aprile 2019. wiki.ubuntu.com/Releases
bhass1

1
gnome-terminal -e commandfunziona solo se commandè quotato. Quindi questo non funziona: gnome-terminal -e "echo hello world; sleep 3"ma questo lo fa: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Sospiro.
bgoodr,

3
Puoi anche tenere aperto gnome-terminal aggiungendo ; $SHELLalla fine del comando. Esempio:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples,

58

Invece di hard-coding gnome-terminal, konsoleeccetera, usa il sistema Alternatives. Il programma che esegue l'emulatore di terminale predefinito è:

x-terminal-emulator

Sul mio sistema, apre una nuova istanza di Konsole ogni volta che eseguo questo comando.

Fortunatamente, i terminali sembrano supportare l' -eopzione per l'esecuzione di un comando (l'ho verificato per konsolee gnome-terminal). Gli argomenti dopo il comando vengono passati al comando invocato. Bash si rifiuta di rimanere aperto nel mio terminale, è necessario uno script aggiuntivo per ottenere un terminale:

#!/bin/sh
"$@"
exec "$SHELL"

Se hai salvato lo script precedente come /home/user/hackye lo hai reso eseguibile, eseguiresti i tuoi script con:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

È richiesto il percorso completo e /home/user/hackydeve essere eseguibile.

Il mio precedente tentativo di eseguire uno script in una nuova finestra del terminale si trova nella revisione n. 2 , era prima che mi rendessi conto che gli argomenti potevano essere passati x-terminal-emulator.


In questo caso, non sarà di grande aiuto poiché chi desidera fare qualcosa che non è lo stesso per tutti i terminali.
nickguletskii,

Tentativo n. 3: questo dovrebbe tenere aperto il terminale ed eseguire il programma con argomenti opzionali.
Lekensteyn,

1
Ho usato l'opzione gnome, tuttavia, una volta eseguito il mio script, il terminale principale si chiude !! .. qualche idea del perché?
McLan,

3
@ Suda.nese Ovviamente, quando il "terminale" termina l'esecuzione dello script, si chiuderà perché non c'è altro da fare. Si potrebbe "risolvere" questo invocando una shell in cui è possibile eseguire comandi ( bash) o avere una linea come read -p "Press Return to continue".
Lekensteyn,

1
Come è possibile eseguire più di un comando nel terminale? Per esempio cd xxx && start.sh. L'interprete vede && come la seconda parte del comando (che è logico), ma se lo cito, cerca di eseguire l'intera cosa come un grande argomento
Richard

9

Abbastanza semplice-

#!/bin/bash

/etc/init.d/ccpd status

Questo è sufficiente per altri comandi che non necessitano di visualizzare nulla nel terminale. Ma qui bisogna vedere lo stato visualizzato.
Quindi, deve essere eseguito in una finestra del terminale

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

L'altro post voleva []essere un segnaposto

Qui "NAMEOFTHEPROFILE" deve essere sostituito con il nome del profilo che "Mantiene il terminale all'uscita del comando".

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


1
@cipricus credo []fosse solo un segnaposto
Karthik T il

fatto. ma devo fare in modo che il terminale non si chiuda così velocemente. immagino che sia anche nella domanda collegata

@cipricus hai provato il profilo uno? Devo solo aggiungere --window-with-profile=NAMEOFTHEPROFILEciò che ho dato
Karthik T,

1
@cipricus Dovrei tornare a casa per dare istruzioni migliori, ma l'idea è quella di creare un profilo speciale con quell'insieme di opzioni e usare il nome del profilo speciale nel posto sopra.
Karthik T,

2
@cipricus se questo è abbastanza per te, allora va bene. Il profilo non è altro che un gruppo di impostazioni. È possibile configurare le impostazioni SOLO per l'uso nello script e non è necessario utilizzarlo in tutti i terminali. Puoi vedere Modifica -> Profili per vedere tutti i profili che hai, e aggiungeresti uno lì che è stato impostato come spiegato nel post che hai collegato
Karthik T

5

Aiutato dalla risposta di @ nickguletskii e dal mio commento sotto la sua risposta, e ispirato dal voto di @ grabantot del mio commento, ecco il mio modo preferito di farlo, specialmente quando voglio che il terminale rimanga aperto in modo da poterlo usare manualmente.

Ex. utilizzo: questo è davvero utile da aggiungere ai programmi di avvio, quindi questo script verrà eseguito, aprirà un terminale, creerà e nominerà una scheda nel terminale ed eseguirà un comando per te. In alternativa, puoi semplicemente aggiungere un collegamento simbolico a questo script sul desktop. Uso questo tipo di approccio in modo da poter fare doppio clic su una singola icona sul desktop e aprirlo in un gruppo di terminali (con varie schede denominate in base al lavoro che ho intenzione di fare in essi) e programmi da configurare il mio ambiente di programmazione, ad esempio, per il lavoro quotidiano.

Ecco un esempio inventato, che apre una singola scheda, la intitola "test", quindi esegue il semplice comando cd /etc; lsal suo interno. La $SHELLparte alla fine forza la shell a rimanere aperta in modo da poter vedere il suo output e continuare a usarla (l'ho imparato da qualche altra parte su Stack Overflow):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Ecco un esempio più complicato che apre 3 schede separate nello stesso terminale gnome. Questo è esattamente il tipo di cosa che fa il mio collegamento sul desktop in modo da poter aprire un sacco di finestre di programmazione contemporaneamente:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Ecco una ripartizione di quel comando sopra:

  • gnome-terminal = apri un terminale gnome
  • --tab = apri una scheda unica per ciò che verrà dopo
  • --title="tab 1" = titolo questa scheda "scheda 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= esegui il bash -c 'cd /etc; ls; $SHELL'comando, che è un comando che ho appena creato come esempio; ecco cosa fa:
    • bash -c dice che è un gioco da ragazzi
    • cd /etc = 'c'hange' d'irectory nel percorso "/ etc"
    • ls = "Non sono i contenuti di questa directory
    • $SHELL= questa informazione criptica è necessaria per mantenere aperta la shell in modo da poter lavorare con essa. Se vuoi che la shell si apra, esegui il tuo comando, quindi chiudi, rimuovi semplicemente questa parte. Tuttavia, voglio che la scheda rimanga aperta in modo da poter fare magie di programmazione. :)
  • ricominciamo quindi dalla --tabparte per produrre la scheda 2, quindi di nuovo per la scheda 3. Personalizza il contenuto del tuo cuore.

Immagine dello schermo:

inserisci qui la descrizione dell'immagine


1
felice di essere stato utile) Ho anche degli script su cui posso semplicemente fare clic e iniziare a lavorare sul progetto. C'erano due problemi con loro: molte finestre di terminale (avevano una schermata completamente separata per loro) e finestre che si chiudevano dopo un arresto anomalo del server, ad esempio. Questa risposta risolve entrambi i miei problemi con --tab + $ SHELL. Nizza
Grabantot,

1

commentando la risposta di Lekensteyn. So che questo è un vecchio post, ma per chiunque lo ritenga utile (come ho appena fatto) Invece di creare un altro "hacky script" inserendo semplicemente una funzione all'interno dello script che stai chiamando

hacky_function()
{
"$@"
exec "$SHELL"
}

Chiama il tuo script con "x-terminal-emulator -e / path / to / script hacky_function argomenti facoltativi qui"

Non dimenticare di inserire "$ @" alla fine dello script


-2

Utilizzare il comando schermo e -d staccare da una sessione schermo esistente e ricollegare qui -m forzare una nuova sessione schermo -S creare una sessione denominata invece di utilizzare il nome predefinito


questa risposta non è affatto chiara, ti preghiamo di renderlo più comprensibile
azerafati,

@azerafati in effetti, lo schermo non apre alcuna finestra del terminale ... non è nemmeno inteso da quel fantastico pacchetto ...
erm3nda
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.