Для запуска моей среды разработки я написал небольшой скрипт. Одна часть — открыть терминал 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"
завершении работы терминал/вкладка также закроются.