Apri il terminale gnome a livello di codice ed esegui i comandi dopo l'esecuzione di bashrc


35

Per iniziare il mio ambiente di sviluppo ho scritto una piccola sceneggiatura. Una parte è aprire un terminale gnome con diverse schede in cui automaticamente alcuni comandi dovrebbero essere eseguiti. Alcuni di questi comandi dipendono da un .bashrc già eseguito. Ma quando si utilizza

gnome-terminal --tab -e "command" --tab --tab

il comando viene eseguito prima dell'esecuzione di .bashrc. Esiste la possibilità di fare in modo che uno gnome-terminal automatizzato si comporti come uno usato manualmente? (anche comandi come "cd / foo / bar" non funzionano con gnome-terminal -e)

Risposte:


45

Una volta che gnome-terminal ha iniziato bash, è fuori dal ciclo per quanto riguarda l'esecuzione del comando: gestisce solo l'input e l'output. Quindi avrai bisogno della collaborazione di bash per eseguire qualcosa dopo che ~/.bashrcè stato caricato.

Innanzitutto, in molti casi, non è necessario eseguire i comandi dopo ~/.bashrc. Ad esempio, è possibile semplicemente aprire un terminale in una directory specifica cd /foo/bar && gnome-terminal. È possibile impostare le variabili di ambiente in modo simile: VAR=value gnome-terminal. (Se ~/.bashrcsovrascrivi le variabili di ambiente, lo stai facendo in modo errato: le definizioni delle variabili di ambiente appartengono~/.profile )

Per eseguire comandi nel terminale, ma prima ~/.bashrcpuoi farlo

gnome-terminal -x sh -c 'command1; command2; exec bash'

Se si desidera utilizzare più schede, è necessario utilizzare -einvece di -x. Gnome-terminal divide inutilmente l'argomento di -espazi anziché eseguirlo attraverso una shell. Tuttavia, puoi scrivere un comando shell se ti assicuri di non includere spazi al suo interno. Almeno con gnome-terminal 2.26, puoi usare le schede, però (sostituiscile <TAB>con un carattere di tabulazione letterale):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

Se si ha bisogno di eseguire comandi dopo ~/.bashrc, rendere esso eseguire i comandi. Ad esempio, includere il seguente codice alla fine di ~/.bashrc:

eval "$BASH_POST_RC"

Quindi eseguire un codice dopo (davvero, alla fine di) il tuo bashrc:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

o (meno pesante sulla quotazione)

BASH_POST_RC='command1; command2' gnome-terminal

Anche se non consiglio particolarmente di farlo in questo modo, potresti essere interessato alle tecniche menzionate in Come avviare un terminale con un determinato testo già inserito nella riga di comando? .


Sì, davvero un bel trucco. Non ci ho mai pensato. Ora devo trovare un modo per impostare la variabile BASH_POST_RC in modo diverso per la scheda specifica. E questo sembra ancora essere un problema. Un semplice "gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" non è possibile :-(
Zardoz,

@Zardoz: In realtà, puoi ingannare gnome-terminal usando i caratteri tab (vedi la mia risposta rivista). Fai attenzione ai molteplici livelli di quotazione.
Gilles 'SO- smetti di essere malvagio' l'

.. funziona :-) ... grazie mille per la tua soluzione e la tua pazienza. Qui il mio comando completo (funziona anche con quegli spazi nei comandi: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rails server \ "; exec bash" '--tab -e' bash -c "export BASH_POST_RC = \" autotest \ "; exec bash" '--tab
Zardoz

Finalmente ha funzionato ... Dopo così tanti test con virgolette tutto intorno. Ecco il mio, usando zsh e aprendo contemporaneamente un server e una console:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger,

1
@terdon No, gnome-terminal -enon invoca affatto una shell. Se lo esegui gnome-terminal -e 'sleep 9', questo esegue il comando sleepcon l'argomento 9e nessuna shell è coinvolta. Se lo esegui, gnome-terminal -e 'sleep 9;bash'il terminale si apre e si chiude immediatamente, perché si sleeplamenta che 9;bashnon è un intervallo di tempo valido. Puoi vedere cosa sta succedendostrace -f -eexecve gnome-terminal -e …
Gilles 'SO- smetti di essere malvagio' il

6

Quando usi l' -eopzione gnome-terminaleseguirai quel comando senza avviare una nuova shell (puoi anche eseguire qualcosa del tipo:) gnome-terminal -e gedit, quindi se vuoi eseguire un comando nella bashshell in un nuovo terminale / scheda devi fare qualcosa del genere:

gnome-terminal -x bash -c "command"

Ma nota che quando "command"finisce anche il terminale / scheda finirà.


1
Penso che intendi gnome-terminal -x bash -c "command"(si -easpetta un singolo argomento). Ed è abbastanza semplice eseguire una shell dopo command, almeno fino a quando si avvia una singola scheda - vedere la mia risposta .
Gilles 'SO- smetti di essere malvagio'

gnome-terminal -x "bash" -c "command"ha funzionato per me. Nota le virgolette sul valore -x arg.
m3nda,

Ricevo # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo il

1
per favore, cosa facciamo dal momento che gli opton -xe -esono deprecati ???
Nyxee,

Credo che ciò non avvenga ~/.bashrcprima di eseguire il comando, come inizialmente richiesto dall'OP.
IgNite,
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.