Otwórz programowo terminal gnome i wykonaj polecenia po wykonaniu bashrc

35

Na początek mojego środowiska programistycznego napisałem mały skrypt. Jedną częścią jest otwarcie terminalu gnome z kilkoma zakładkami, w których automatycznie należy wykonać niektóre polecenia. Niektóre z tych poleceń zależą od już wykonanego .bashrc. Ale podczas używania

gnome-terminal --tab -e "polecenie" --tab --tab

polecenie jest wykonywane przed wykonaniem .bashrc. Czy istnieje możliwość, aby zautomatyzowany terminal gnome -e zachowywał się jak używany ręcznie? (nawet polecenia takie jak „cd / foo / bar” nie działają z gnome-terminalem -e)

Zardoz
źródło

Odpowiedzi:

45

Kiedy gnome-terminal rozpoczął bash, jest poza pętlą, jeśli chodzi o wykonywanie poleceń: zarządza tylko wejściem i wyjściem. Więc potrzebujesz współpracy bash, aby uruchomić coś po ~/.bashrczaładowaniu.

Po pierwsze, w wielu przypadkach nie trzeba wykonywać poleceń później ~/.bashrc. Na przykład otwarcie terminala w określonym katalogu można po prostu zrobić cd /foo/bar && gnome-terminal. Można ustawić zmienne środowiskowe w podobny sposób: VAR=value gnome-terminal. (Jeśli ~/.bashrcprzesłaniasz zmienne środowiskowe, robisz to źle: należą do nich definicje zmiennych środowiskowych~/.profile )

Aby wykonać polecenia w terminalu, ale wcześniej ~/.bashrcmożesz to zrobić

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

Jeśli chcesz korzystać z wielu kart, musisz użyć -ezamiast -x. Gnome-terminal nieprzydatnie rozdziela argument -espacji zamiast wykonywać go przez powłokę. Niemniej jednak możesz napisać polecenie powłoki, jeśli upewnisz się, że nie ma w nim spacji. Przynajmniej w gnome-terminal 2.26 można jednak używać tabulatorów (zastąpić <TAB>literalnym znakiem tabulacji):

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'

Jeśli trzeba uruchamiać polecenia po ~/.bashrc, uczynić go uruchomić polecenia. Na przykład dołącz następujący kod na końcu ~/.bashrc:

eval "$BASH_POST_RC"

Następnie uruchom jakiś kod po (naprawdę na końcu) twojego bashrc:

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

lub (mniej obciążające cytowanie)

BASH_POST_RC='command1; command2' gnome-terminal

Chociaż nie polecam robić tego w ten sposób, możesz być zainteresowany technikami wymienionymi w Jak uruchomić terminal z pewnym tekstem wprowadzonym już w wierszu poleceń? .

Gilles „SO- przestań być zły”
źródło
Tak, rzeczywiście fajna sztuczka. Nigdy o tym nie myślałem. Teraz muszę znaleźć sposób na ustawienie zmiennej BASH_POST_RC w inny sposób dla konkretnej karty. I to wciąż wydaje się stanowić problem. Prosty „okien terminala --tab -e«BASH_POST_RC = ls»--tab” nie jest możliwe :-(
Zardoz
@Zardoz: W rzeczywistości można oszukać terminal gnome przy użyciu znaków tabulacji (zobacz moją poprawioną odpowiedź). Zwróć uwagę na wiele poziomów cytowania.
Gilles 'SO - przestań być zły'
.. to działa :-) ... wielkie dzięki za twoje rozwiązanie i cierpliwość. Tutaj moje pełne polecenie (działa nawet z tymi spacjami w poleceniach: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" serwer szyn \ "; exec bash"”--tab -e 'bash -c "eksport BASH_POST_RC = \" autotest \ "; exec bash"' --tab
Zardoz
W końcu sprawiło, że zadziałało ... Po tak wielu testach z cytatami dookoła. Oto moje, używając zsh i jednocześnie otwierając serwer i konsolę: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 Nie, w gnome-terminal -eogóle nie wywołuje powłoki. Jeśli uruchomisz gnome-terminal -e 'sleep 9', spowoduje to wykonanie polecenia sleepz argumentem 9i nie będzie dotyczyła powłoki. Jeśli wykonasz gnome-terminal -e 'sleep 9;bash'polecenie, terminal natychmiast się otworzy i zamknie, ponieważ sleepnarzeka, że 9;bashnie jest to prawidłowy przedział czasu. Możesz obserwować, co się dziejestrace -f -eexecve gnome-terminal -e …
Gilles „SO- przestań być zły”
6

Kiedy użyjesz tej -eopcji gnome-terminal, uruchomi to polecenie bez uruchamiania nowej powłoki (możesz nawet uruchomić coś takiego:) gnome-terminal -e gedit, więc jeśli chcesz uruchomić polecenie w bashpowłoce w nowym terminalu / karcie, musisz zrobić coś takiego:

gnome-terminal -x bash -c "command"

Należy jednak pamiętać, że po "command"zakończeniu terminal / karta również się zakończy.

Cyrus
źródło
1
Myślę, że masz na myśli gnome-terminal -x bash -c "command"( -eoczekuje jednego argumentu). I dość łatwo jest później wykonać powłokę command, przynajmniej tak długo, jak zaczynasz jedną kartę - zobacz moją odpowiedź .
Gilles „SO- przestań być zły”
gnome-terminal -x "bash" -c "command"pracował dla mnie. Uwaga cytuje wartość -x arg.
m3nda
Dostaję # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo
1
proszę, co robimy, odkąd -xi -eoptony są przestarzałe?
nyxee
Uważam, że nie uruchamia się to ~/.bashrcprzed wykonaniem polecenia, jak pierwotnie poprosił OP.
IgNite