Точно так же, как файлы могут иметь .ext
для определения, какой тип файла это (обычно названо "расширением") каталоги иногда имеют .d
для показа это - каталог и не файл. Это - его тип. Значение по умолчанию ls
вывод визуально не дифференцирует каталоги и файлы, таким образом, .d
просто старая конвенция показать ее тип (каталог) в таких списках.
Я могу решить, по крайней мере, часть проблемы: почему stop
часть не работает. Экспериментально, когда Вы запускаете Экранную сессию в отдельном режиме (screen -d -m
), никакое окно не выбрано, таким образом, вводит позже отправленный с screen -X stuff
просто потерян. Необходимо явно указать, что Вы хотите отправить нажатия клавиш в окно 0 (-p 0
). Это - хорошая идея так или иначе, в случае, если Вы, оказывается, создаете другие окна на той Экранной сессии по любой причине.
screen -S minecraft -p 0 -X stuff "stop^M"
(Экран переводит ^M
управлять-M, который является символом, отправленным клавишей Enter.)
Проблема с запуском сессии из сценария, вероятно, связана с unMENU.
Просто головы, что $()
создайте новые строки полос из вывода команды так, чтобы выходные строки могли использоваться в качестве аргументов в пользу других программ. Это может вызвать неожиданное поведение. В этом случае я предполагаю, что Вы конкретно пытаетесь отправить эквивалент нажатия клавиши Enter. В то время как возврат каретки Вы отправляете с \r
не будет чередоваться, существует несколько более легких способов ввести тот символ без потребности в дополнительной команде.
Можно поместить регулярную новую строку в двойных кавычках
screen -S minecraft -X stuff "stop
"
Или можно войти, символ в терминальной строке с помощью Ctrl+v Вводят последовательность. Это посмотрит что-то как ^M
в терминале, но это - специальный символ новой строки.
screen -S minecraft -X stuff "stop^M"
Экран имеет проблему с принятием входа к экранной сессии, которая никогда не присоединялась. При выполнении этого, это перестанет работать:
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"
screen -d -RR minecraft
?
– Caleb
28.05.2011, 16:38
.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!"