Как заставить GNU Screen запускать новое окно в рабочем каталоге CURRENT? - PullRequest
46 голосов
/ 05 октября 2009

По умолчанию, когда вы создаете новое окно в GNU Screen, оно запускается в каталоге, где вызывается экран. Я хочу открыть новое окно в GNU Screen в текущем рабочем каталоге окна, в котором я сейчас нахожусь. Как это сделать? Спасибо!

Ответы [ 8 ]

29 голосов
/ 05 октября 2009

См. Команду gnu screen chdir. Все новые окна, созданные на экране, используют его в качестве исходного каталога. Используя это вы можете сделать что-то вроде

chdir /home/dan/newscreendir
screen

И ваше новое окно (вместе с любыми окнами, созданными в будущем) будет в заданном каталоге. Если это всегда будет текущий рабочий каталог, вы можете настроить что-то в своем screenrc, чтобы сделать это в одной команде.

См. Справочную страницу экрана gnu, она довольно полная.

Команда chdir на экране

Экран не может получить доступ к вашей переменной оболочки или выполнить команды с обратным тактом. Самое близкое, что я могу сделать в один клик - это маленький скрипт bash, подобный этому

screen -X setenv currentdir `pwd`
screen -X eval 'chdir $currentdir' screen

или более компактно

screen -X eval "chdir $PWD"

screen -X отправляет команду в текущий сеанс экрана. Первая строка создает переменную с именем currentdir. Вторая строка отправляет команду currentdir на команду chdir, а затем создает новое окно экрана.

10 голосов
/ 19 июля 2010

Простое решение - поместить следующие строки в ваш ~ / .screenrc, а затем использовать C-x для открытия новых окон:

bind ^ x

bind ^ x stuff "screen -X chdir \ $ PWD; screen ^ M"

http://www.michaelkelleher.info содержит дополнительные советы для пользователей среднего и продвинутого уровня.

Поскольку этот сайт, кажется, исчез, вы можете найти его архив здесь: Личный сайт Майкла Келлехера на Archive.org

7 голосов
/ 30 июня 2012

Я не нашел никакого решения, которое бы работало, когда у вас уже запущен процесс в окне, поэтому я пришел к своей собственной идее. Я добавил следующие строки в мой .bash_profile:

scr_cd()
{
    cd $1
    screen -X chdir $PWD
}
if [ "$TERM" == 'screen' ]; then
    alias cd=scr_cd
fi

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

4 голосов
/ 15 августа 2013

Возможно, это специфично для Byobu, но простой ввод screen открывает новое окно в текущем каталоге.

2 голосов
/ 20 октября 2015

Чтобы на экране открылась новая вкладка / окно в текущем каталоге, вы можете добавить следующий код в ваш файл .screenrc:

bind c stuff "screen bash^M"

В результате команда Ctrl + a c откроет новые вкладки / окна в каталоге текущего окна / вкладки.

Примечание: Вы должны убедиться, что screen не не запускает оболочку входа по умолчанию, так как это приведет к запуску оболочки в каталоге по умолчанию для оболочка входа в систему, а не текущий каталог. Это означает, что в вашем файле .screenrc ваша команда shell не может содержать тире ('-').

Например, это неправильно (то есть запускается оболочка входа в систему):

shell -$SHELL

Но это правильно (то есть не запустит оболочку входа в систему):

shell $SHELL

Примечание 2: К сожалению, этот метод не работает точно так же, как команда по умолчанию для нового окна / табуляции в screen. Вместо этого он записывает команду в текущее окно и выполняет ее для создания нового окна / вкладки, поэтому она не будет работать во время какого-то длительного процесса оболочки. Другими словами, это сочетание клавиш может выполняться только тогда, когда могут выполняться обычные команды оболочки.

Примечание 3: Если вы хотите, чтобы screen открывал новые окна / вкладки в текущем каталоге и открывал оболочку входа , вы можете добавить следующий код к вашему .screenrc файлу:

bind c stuff "screen bash -l^M"
1 голос
/ 30 января 2013

Вы также можете запустить:

screen -X eval "chdir $(pwd)"

Или, если вы хотите запустить новое окно, как только вы установите chdir, используйте:

screen -X eval "chdir $(pwd)" screen
0 голосов
/ 06 декабря 2013

У меня есть почти идеальное решение для bash. :)

  1. Если вы никогда не используете password для установки пароля блокировки экрана, просто добавьте его в $HOME/.bash_profile:

    export PROMPT_COMMAND='screen -p $WINDOW -X chdir "$PWD"'
    
  2. Нужен пароль? с этим:

    # the digest of password "abc" is ID1wIq4l2t7s6
    export PROMPT_COMMAND='screen -p $WINDOW -X eval "password none" "chdir \"$PWD\"" "idle 0 password ID1wIq4l2t7s6"'
    

Просто надеемся, что разработчики экрана добавят переменную окружения PWD как можно скорее.

0 голосов
/ 10 августа 2012

В вашем .screenrc вставьте строку, которая использует команду chdir, если вы хотите один и тот же каждый раз.

Если у вас есть сеанс рабочего экрана внутри этого сеанса, вы можете набрать:

screen -X chdir [arg]

Без аргумента это будет ваш домашний каталог, тот же результат, что и при наборе cd.

Если у вас есть сценарий (это вопрос программирования и сайт) или вы находитесь за пределами экрана, и экран запущен, вы можете выполнить:

`which screen` -x -X chdir [arg]

Что вы, вероятно, последуете, запустив какой-то новый процесс на экране:

`which screen` -x -X screen [command to run in that dir] [args for the command]

Я еще не нашел способа узнать, что это было, и изменить его обратно (в сценарии), поэтому, если кто-то захочет обновить этот ответ этим, пожалуйста, сделайте.

...