Могу ли я создать новый терминал, который является клоном текущего терминала?

8

Допустим, я занимаюсь разработкой кода в каталоге / asdf / qwer / dfgh / wert / asdf / qwer, и я добавил в свой путь еще около трех таких каталогов, и у меня есть набор тайных переменных окружения. Затем я понимаю, что мне действительно нужен еще один терминал, открытый и настроенный таким же образом (хотя эта необходимость не повторяется, так что я бы просто изменил свой .bashrc). Есть ли команда, чтобы открыть новое окно терминала, которое является точным клоном этого?

Джон Берриман
источник

Ответы:

10

Клонирование пути легко, если вы можете запустить вашу терминальную программу из командной строки. Предполагая, что вы используете xterm, просто запустите xterm &из терминала терминала, который вы хотите клонировать. Новый xterm будет запускаться в том же каталоге, если только вы не настроили его для запуска в качестве оболочки входа в систему. Любые экспортированные переменные среды также будут перенесены, но не экспортированные переменные - нет.

Быстрый и грязный способ клонирования всей среды (включая неэкспортированные переменные) заключается в следующем:

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

Если вы установили какие-либо пользовательские параметры оболочки, вам придется также повторно применить их.

Вы можете обернуть весь этот процесс в легко запускаемый скрипт. Сценарий сохранит среду в известный файл, затем запустите xterm. Сделайте так, чтобы ваш .bashrc проверил этот файл, а затем отправьте его и удалите, если он найден.


С другой стороны, если вы не хотите запускать один терминал с другого или просто хотите больше контроля, вы можете использовать пару функций, которые вы определили в .bashrc:

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}

РЕДАКТИРОВАТЬ : Изменено putstateтак, чтобы он копировал «экспортированное» состояние переменных оболочки, чтобы соответствовать другому методу. Есть и другие вещи, которые также могут быть скопированы, такие как параметры оболочки (см. help set) - так что в этом скрипте есть место для улучшения.

Jander
источник
Ого ... классное объяснение, которое привело к некоторым выводам, которые у меня были раньше.
Джон Берриман
Я модифицировал ваш скрипт, чтобы взять аргумент и поместить put и получить среду в файл с именем аргумента ... теперь у меня может быть несколько сред! : D
Джон Берриман
Вопрос: что значит "." делать в GetState?
Джон Берриман
"." говорит: «Запустите содержимое этого файла, используя текущую оболочку, как если бы они были напечатаны в командной строке». Без "." Новая копия bashзапускает команды в файле и затем завершается, и текущая среда оболочки не меняется.
Jander
0

Если вы запустите screen(GNU Screen) в своей определенной среде, эта среда будет использоваться подпроцессом (т.е. screen), и вы можете использовать его для создания новых терминалов. Но если вы хотите раскошелиться в другой раз (a screenin a screen), это будет сложно.

shellholic
источник
0

В аналогичной ситуации я также счел полезным запустить новую оболочку в том же каталоге, что и текущая. Я использовал такой рецепт, чтобы запустить оболочку.

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

Опция -t необходима всякий раз, когда вы явно запускаете оболочку, используя ssh. Это приводит к созданию псевдотетти для процесса. Это необходимо для правильной работы команд истории и других интерактивных функций. Более ранние строки в сценарии устанавливают DIR в текущий каталог, а SHELL - в предпочитаемую пользователем оболочку.

Крис Квинель
источник
0

в то время как экспортированные переменные перебираются на другую сторону, используя вышеуказанную функцию 'getstate', по какой-то причине они в конечном итоге не экспортируются туда (как можно увидеть, используя простой os.getenv из python). мне кажется, это работает лучше, когда я изменяю getstate в качестве псевдонима:

alias getstate=". ~/environment.tmp"
srepmub
источник