отправка ввода текста в отдельный экран

Точно так же, как файлы могут иметь .ext для определения, какой тип файла это (обычно названо "расширением") каталоги иногда имеют .d для показа это - каталог и не файл. Это - его тип. Значение по умолчанию ls вывод визуально не дифференцирует каталоги и файлы, таким образом, .d просто старая конвенция показать ее тип (каталог) в таких списках.

45
08.12.2018, 01:45
3 ответа

Я могу решить, по крайней мере, часть проблемы: почему stop часть не работает. Экспериментально, когда Вы запускаете Экранную сессию в отдельном режиме (screen -d -m), никакое окно не выбрано, таким образом, вводит позже отправленный с screen -X stuff просто потерян. Необходимо явно указать, что Вы хотите отправить нажатия клавиш в окно 0 (-p 0). Это - хорошая идея так или иначе, в случае, если Вы, оказывается, создаете другие окна на той Экранной сессии по любой причине.

screen -S minecraft -p 0 -X stuff "stop^M"

(Экран переводит ^M управлять-M, который является символом, отправленным клавишей Enter.)

Проблема с запуском сессии из сценария, вероятно, связана с unMENU.

41
27.01.2020, 19:34
  • 1
    , работает отлично (по крайней мере, из командной строки, введет парней неменю по абсолютному адресу позже). Это, кажется, бросило довольно много людей, и это - первый раз, когда я видел конкретное решение. Мне просто жаль, что у меня не было достаточного количества точек для голосования Вас :D –  richard plumb 28.05.2011, 18:11
  • 2
    Прокляните s ** t! Это работает, даже экран уже присоединяется, не повторно прикрепляя его! Что является отличным способом отправить команды в простые приложения из других приложений в системе.Спасибо! :) –  Grzegorz Wierzowiecki 29.11.2011, 11:54
  • 3
    у меня никогда не было этой проблемы, вероятно, потому что я всегда планировал иметь несколько (именованных) окон на своей экранной сессии и мне всегда, выбирает окно по имени. –  Ekevoo 08.01.2014, 15:48
  • 4
    Руководство, для ссылки:-X Отправляют указанную команду в рабочую экранную сессию. Можно использовать-S опцию указать экранную сессию, если у Вас есть несколько экранных выполнений сессий. Можно использовать-d или-r опцию сказать экрану только искать присоединенные или отсоединенные экранные сессии. Обратите внимание, что эта команда не работает, если сессия защищена паролем. –  KrisWebDev 24.09.2016, 11:41

Во-первых, примечание по легкому вводу новых строк:

Просто головы, что $() создайте новые строки полос из вывода команды так, чтобы выходные строки могли использоваться в качестве аргументов в пользу других программ. Это может вызвать неожиданное поведение. В этом случае я предполагаю, что Вы конкретно пытаетесь отправить эквивалент нажатия клавиши Enter. В то время как возврат каретки Вы отправляете с \r не будет чередоваться, существует несколько более легких способов ввести тот символ без потребности в дополнительной команде.

  1. Можно поместить регулярную новую строку в двойных кавычках

    screen -S minecraft -X stuff "stop
    "
    
  2. Или можно войти, символ в терминальной строке с помощью Ctrl+v Вводят последовательность. Это посмотрит что-то как ^M в терминале, но это - специальный символ новой строки.

    screen -S minecraft -X stuff "stop^M"
    

Во-вторых, примечание по ошибочному экранному поведению. (Объяснение и решение Gilles)

Экран имеет проблему с принятием входа к экранной сессии, которая никогда не присоединялась. При выполнении этого, это перестанет работать:

screen -d -m -S minecraft zsh
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Но если Вы выполните это, то это будет работать:

screen -d -m -S minecraft zsh
screen -r minecraft (then disconnect with Ctrl-a-d)
screen -S minecraft -X stuff "stop^M"
screen -r minecraft

Наконец, Вы могли использовать намного лучше ведущее себя tmux вместо screen.

Экран GNU много лет был фактическим оконечным мультиплексором, но он долго прекращал разрабатываться и ошибки, и причуды не становятся фиксированными. Tmux находится в процессе активного развития, включает много функций, которых не может коснуться экран, и его поведение из поля скорее более интуитивно. Кроме того, это лучше документируется. Вот то, как Вы преобразовали бы свой код:

# Start new detached tmux session with a named window pane running the java app
tmux new-session -d -n minecraft /usr/lib/java/bin/java [args]

# Send it keys to stop the mincraft server
tmux send-keys -t minecraft "stop^M"
23
27.01.2020, 19:34
  • 1
    , если я вручную переключаю использование экрана-r, я вижу экран, и нет никакого текста, введенного вообще. даже если бы возврат каретки перестал работать, то я должен все еще получить введенную 'остановку'. Но ничто –  richard plumb 28.05.2011, 16:24
  • 2
    , если я имею сценарий с экраном-r на одной строке и затем экранирую материал-X "stop^M" затем, это действительно останавливает сервер, но также и жалуется с 'ошибкой uknown опция r' –  richard plumb 28.05.2011, 16:36
  • 3
    , в котором я протестировал здесь путем создания экранной сессии, затем использования команды выше, и это работает отлично. Могут Вы для соединения с экранным использованием сессии screen -d -RR minecraft? –  Caleb 28.05.2011, 16:38
  • 4
    да, который подключает меня к экрану. экранирует-r.. держитесь, если я пробую экран-S, Minecraft-X наполняют "stop^M", затем вручную экранируют-r, на экране существует текст 'остановки'. –  richard plumb 28.05.2011, 16:39
  • 5
    Работы для меня. Возможно, у Вас есть что-то броское в Вашем .screenrc или у Вас есть набор более не существующих экранных сессий, открытых с тем именем и таким образом, Вы отправляете данные в неправильный? screen -list? –  Caleb 28.05.2011, 16:42

Я прошу прощения за то, что выкапываете этот старый пост, но это помогло бы мне в моих усилиях была бы эта информация была доступна в то время, когда у меня была подобная проблема. Есть много вопросов о том, как отправлять команды экрана в скрипте Bash. Как и с кошкой скинникой, это может быть сделано, но мне так нравится. С этим вы можете отправить любую команду или сказать что-нибудь просто, позвонив функцию Say_This.

#!/bin/bash

say_this()
{
    screen -S minecraft -p 0 -X stuff "$1^M"
}

say_this "say Saving world"
say_this "save-off"
say_this "save-all"
...

Это с SSH!

#!/bin/bash

say_this()
{
    # Dont forget to set NAME or whatever
    ssh -p 8989 192.168.1.101 screen -S $NAME -p 0 -X stuff \"$1^M\"
}

say_this "say test"
say_this "say !@#$%^&*()<>?This string will work!"
5
27.01.2020, 19:34

Теги

Похожие вопросы