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

35

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

gnome-терминал --tab -e "команда" --tab --tab

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

Zardoz
источник

Ответы:

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 по-разному для конкретной вкладки. И это все еще кажется проблемой. Простой "гном-терминал --tab -e 'BASH_POST_RC = LS' --tab" не представляется возможным :-(
Zardoz
@Zardoz: На самом деле, вы можете обмануть gnome-терминал, используя символы табуляции (см. Мой исправленный ответ). Помните о нескольких уровнях цитирования.
Жиль "ТАК - перестать быть злым"
.. это работает :-) ... большое спасибо за ваше решение и ваше терпение. Вот моя полная команда (работает даже с этими пробелами в командах: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rails server \ "; Exec баш"»--tab -e 'Баш -c "экспорт BASH_POST_RC = \" автоиспытания \ "; Exec баш"' --tab
Zardoz
Наконец-то все заработало ... После ооочень много тестов с кавычками. Вот мое, использующее 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 …
Жиль "ТАК - перестань быть злым"
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.
m3nda
Я получаю # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo
1
пожалуйста, что мы делаем, так как -xи -eoptons устарели ???
nyxee
Я считаю, что это не выполняется ~/.bashrcдо выполнения команды, как первоначально было задано ОП.
IgNite