Apertura di più schede terminali e comando in esecuzione


9

Devo aprire più schede terminali, assegnare loro i titoli, andare in una directory e far eseguire un comando a ciascuna scheda.

Sono nuovo di Linux e script di shell, dopo aver cercato online e verificato alcune soluzioni, ho creato questo script ( EDITED basato sulle risposte di seguito):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Apre le schede, le nomina, ma non esegue i comandi che generano questo errore:

Si è verificato un errore durante la creazione del processo figlio per questo terminale

Un altro difetto è che se ho fermato il comando in esecuzione, si chiude la scheda, che non voglio. Devo essere in grado di interrompere il comando ed eseguirlo nuovamente nella stessa scheda.

Cosa c'è di sbagliato con la sceneggiatura? C'è un altro modo più semplice per farlo?

Nota: se ho rimosso la parte (-e "\" bash -c $ {cmds [i]}; bash \ "") dal comando, si aprono le schede nella directory specificata e li denomino, senza errori.

-Edit-1:

Dopo aver applicato la risposta @Tuknutx di seguito e aver modificato lo script, l'errore non appare più, ma mi dà bash: rails c: command not founde rails screa una nuova app rails invece di avviare il server rails, sto usando .rmvrc per selezionare un gemset una volta che si accede a questa cartella .


Se si desidera eseguire lo script all'avvio di Ubuntu: - è possibile eseguire lo script come servizio di avvio ( help.ubuntu.com/community/UbuntuBootupHowto ) o: utilizzare "applicazioni di avvio" nel proprio ambiente desktop
Aboelnour

se lo scrivo cmds[1]="'ping 192.168.9.9'"mi dà lo stesso errore ma l'ho risolto rimuovendo la singola citazione. Quindi se scrivo cmds[1]="ping 192.168.9.9"Funziona.
margherita,

@Brary ma non capisco perché apre tre schede: una predefinita e altre due impostate nello script. Perché definiamo tab=" --tab-with-profile=Default"??
margherita,

Risposte:


3

Consiglierei di usarlo tmuxcon tmuxinator, farà il lavoro per te e puoi fare affidamento anche sui terminatorlayout!

Per la terminatorverifica del layout, la risposta di mhnagaoka anche qui askubuntu:

  1. Dopo aver impostato il layout, fai clic con il pulsante destro del mouse su qualsiasi sfondo del terminale e scegli Preferenze → scheda Layout e fai clic sul pulsante Aggiungi .

  2. Dagli un nome e premi Chiudi .

  3. Questo dovrebbe creare il ~/.config/terminator/configfile menzionato .

  4. Ora puoi avviare terminator usando il layout salvato usando: terminator -l yourLayout(sostituisci yourLayout con quello che hai scelto al passaggio 2).

  5. (opzionale) Modificare il ~/.config/terminator/configfile in modo che dove si dice [layouts]e nidificato sotto di esso [[yourLayout]], rinominare yourLayout per difetto e rimuovere / rinominare il precedente di default di layout. Ora, quando si avvia Terminator senza parametri, caricherà la vostra abitudine [[default]]layout!


2

Per riassumere un paio di altre risposte e i loro commenti, ecco cosa ho finito con:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Si noti che ho rimosso la scheda "principale", i profili e i titoli (che sembrano essere obsoleti gnome-terminal).


L'output di $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.`Usa“ - ”per terminare le opzioni e mettere la riga di comando per eseguirla dopo. . that's an output but the comands get executed. When i use $ scheda - `il comando non viene eseguito e la dsisplays terminale:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee

1

Prova questo:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

altrimenti l'intera espressione dopo -e verrà interpretata come il comando.

Per includere alias da .bashrc usare -icinvece dic


L'errore non appare più, grazie. Ma mi dà bash: rails c: command not founde 'rails s' crea una nuova app rails invece di avviare il server rails. Questo cambia l'ambito della domanda, lo modificherò con la tua modifica per la sceneggiatura
Brary

Ha funzionato se hai provato rails cun terminale senza nient'altro? Forse dovrebbe essere rails -c?
TuKsn,

Ho provato che non ha funzionato. Ho anche provato rvm list gemsetse dice No command 'rvm' found.. esegui lo stesso comando rvm list gemsetsnella prima scheda che si apre senza eseguire un comando e ha funzionato! esegue il comando prima che l'ambiente venga caricato e il file .rvmrc sia caricato?
Brary,

1

L'argomento che stai dando all'opzione -e "bash -c command; bash"include le virgolette. Interpreta l'intera stringa come il nome di un comando! Prova a modificare: -e "bash -c 'command ; bash'". In questo modo viene eseguito ciò che viene eseguito sulla finestra del terminale commande, successivamente, viene eseguita una shell figlia, che presumo sia ciò che desideri. Per inciso, puoi anche dire 'command & bash'; questo eseguirà il comando in background e ti darà immediatamente la shell figlia.


Ho cambiato questo options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )in options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )e mi ha dato lo stesso errore .. lo sto facendo bene?
Brary,

Non del tutto corretto: rimuovere \ "prima del primo bash e \" dopo il 'dopo il secondo bash.
Silvio Levy,

Grazie, ho modificato la domanda e ne ho modificato l'ambito per includere rails e rvm.
Brary,
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.