Програмно відкрийте термінал gnome та виконайте команди після виконання bashrc


35

Для початку свого розробницького середовища я написав невеликий сценарій. Одна частина полягає у відкритті терміналу gnome з декількома вкладками, де автоматично слід виконувати деякі команди. Деякі з цих команд залежать від уже виконаного .bashrc. Але при використанні

gnome-terminal --tab -e "команда" --tab --tab

команда виконується до .bashrc. Чи є можливість зробити автоматизований термін-gnome -e так, як він використовується вручну? (навіть команди типу "cd / foo / bar" не працюють з gnome-terminal -e)

Відповіді:


45

Після того, як gnome-термінал запустив bash, він вийшов із циклу, що стосується виконання команд: він управляє лише входом та виходом. Таким чином, вам знадобиться співпраця bash, щоб запустити щось після ~/.bashrcзавантаження.

По-перше, у багатьох випадках вам насправді не потрібно виконувати команди після ~/.bashrc. Наприклад, відкрити термінал у певному каталозі можна просто за допомогою cd /foo/bar && gnome-terminal. Ви можете встановити змінні оточення подібним чином: VAR=value gnome-terminal. (Якщо ваші ~/.bashrcпереохолодження змінних середовища, ви робите це неправильно: визначення змінних оточення належать~/.profile )

Для виконання команд у терміналі, але раніше ~/.bashrc, ви можете це зробити

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

Якщо ви хочете використовувати кілька вкладок, вам доведеться використовувати -eзамість -x. Gnome-термінал ненавмисно розбиває аргумент -eна пробіли, а не виконує його через оболонку. Тим не менш, ви можете написати команду оболонки, якщо переконайтеся, що в неї не включені пробіли. Принаймні, з gnome-terminal 2.26, хоча ви можете використовувати вкладки (замінити <TAB>буквальним символом вкладки):

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'

Якщо вам потрібно запустити команди після ~/.bashrc, змусьте її виконувати команди. Наприклад, включіть такий код наприкінці ~/.bashrc:

eval "$BASH_POST_RC"

Потім запустіть деякий код після (дійсно в кінці) вашого bashrc:

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

або (менш важкий при цитуванні)

BASH_POST_RC='command1; command2' gnome-terminal

Хоча я особливо не рекомендую робити це таким чином, вас можуть зацікавити методи, згадані в розділі Як запустити термінал з певним текстом, який вже вводиться в командному рядку? .


Так, справді приємний трюк. Ніколи про це не думав. Тепер я повинен знайти спосіб встановити змінну BASH_POST_RC по-різному для конкретної вкладки. І це все ще здається проблемою. Простий "gnome-terminal --tab -e" BASH_POST_RC = ls '--tab "неможливий :-(
Zardoz

@ Zardoz: Насправді, ви можете обманути gnome-термінал, використовуючи символи вкладки (див. Мою переглянуту відповідь). Зважайте на кілька рівнів котирування.
Жиль "ТАК - перестань бути злим"

.. працює :-) ... дякую за ваше рішення та терпіння. Ось моя повна команда (працює навіть з тими пробілами в командах: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "експорт BASH_POST_RC = \" рельсовий сервер \ "; exec bash" '--tab -e' bash -c "експорт BASH_POST_RC = \" autotest \ "; exec bash" '--tab
Zardoz

Нарешті змусив це працювати ... Після Sooo безліч тестів з цитатами в усьому напрямку. Ось моя, використовуючи zsh та відкриваючи сервер та консоль одразу: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"'
Августин Рідінгер

1
@terdon Ні, gnome-terminal -eвзагалі не викликає оболонку. Якщо ви запускаєте gnome-terminal -e 'sleep 9', то команда виконує sleepаргумент 9, і оболонка не бере участь. Якщо ви виконаєте, gnome-terminal -e 'sleep 9;bash'то термінал відкриється та негайно закривається, тому що sleepскаржиться, що 9;bashце не допустимий інтервал часу. Ви можете спостерігати за тим, що відбуваєтьсяstrace -f -eexecve gnome-terminal -e …
Жил "SO- перестань бути злим"

6

Коли ви використовуєте -eпараметр, команда gnome-terminalзапустить цю команду без запуску нової оболонки (ви навіть можете виконати щось на кшталт gnome-terminal -e gedit:), тож якщо ви хочете запустити команду в bashоболонку в новий термінал / вкладку, ви повинні зробити щось подібне:

gnome-terminal -x bash -c "command"

Але зауважте, що після "command"закінчення термінал / вкладка також закінчиться.


1
Я думаю, ти маєш на увазі gnome-terminal -x bash -c "command"( -eочікує єдиного аргументу). І виконати оболонку досить просто command, принаймні, доки ви запускаєте одну вкладку - дивіться мою відповідь .
Жил "ТАК - перестань бути злим"

gnome-terminal -x "bash" -c "command"працював на мене. Зверніть увагу на котирування значення -x arg.
м3нда

Я отримую # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
будь ласка, що ми робимо, оскільки оптони -xта -eоптони застаріли ???
nyxee

Я вважаю, що це не запускається ~/.bashrcперед виконанням команди, як спочатку просив ОП.
IgNite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.