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

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

Для запуска моей среды разработки я написал небольшой скрипт. Одна часть — открыть терминал gnome с несколькими вкладками, где автоматически должны выполняться некоторые команды. Некоторые из этих команд зависят от уже выполненного .bashrc. Но при использовании

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

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

решение1

После того, как gnome-terminal запустил 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-terminal бесполезно разбивает аргумент на -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

Хотя я не особо рекомендую делать это таким образом, вас могут заинтересовать методы, упомянутые в Как запустить терминал, если в командной строке уже введен определенный текст?.

решение2

При использовании этой -eопции gnome-terminalкоманда будет выполнена без запуска новой оболочки (можно даже запустить что-то вроде: gnome-terminal -e gedit), поэтому, если вы хотите выполнить команду в bashоболочке в новом терминале/на новой вкладке, вам нужно сделать что-то вроде этого:

gnome-terminal -x bash -c "command"

Но учтите, что по "command"завершении работы терминал/вкладка также закроются.

Связанный контент