Во-первых,-R означает, что вы пытаетесь возобновить существующий сеанс экрана, который, вероятно, уже что-то запускает. В этом случае вы не можете просто вставить в него свои команды оболочки и надеяться, что они будут выполнены. Что, если в возобновленном сеансе экрана, например, был запущен редактор? Поэтому не используйте-R , если вы хотите указать команду для запуска.
Другая проблема заключается в том, что когда вы используете перенаправление ввода через << __EOF__
, вызываемая программа запускается без tty , то есть без интерактивного терминала. Это можно легко продемонстрировать здесь :
$ tty
/dev/pts/0
$ tty << __EOF__
__EOF__
not a tty
К счастью для вас, screen
поддерживает запуск пользовательских команд при запуске. Это так же просто, какscreen command args
(не заметить-R в послеэкранном режиме ).
В вашем случае вам придется передавать все свои команды в качестве аргументов в /bin/sh
, потому что экран не будет запускать для вас несколько команд оболочки. Что-то вроде этого должно работать:
$ screen /bin/sh -cx "cd /home/users/devops_tester/apps/Selenium-Webdriver; export DISPLAY=:99; npm start"
Он создаст новый сеанс экрана и выполнит ваши команды.-x заставляет оболочку печатать команды, которые она запускает, для справки. Это необязательно, вы можете удалить его.
Вы также можете запустить описанное выше в сеансе немедленного отсоединения экрана и повторно -подключиться к нему позже:
$ screen -d -m /bin/sh -cx "cd /home/...; export...; npm start"
# runs the commands in screen but returns immediately
Это полезно, если вы хотите, например, запускать команды во время запуска системы.
И, конечно же, вы можете повторно -прикрепить вышеуказанный сеанс, чтобы посмотреть, что там происходит.
$ screen -R # re-attach to the above screen session
И последнее, но не менее важное -вместо того, чтобы передавать все ваши команды в качестве аргументов /bin/sh
, может быть проще создать небольшой сценарий оболочки из 3 -лайнеров, сделать его исполняемым и запустить его с помощью простого вызова:
$ screen /path/to/the-script
Чтобы получить год выпуска и автора, вы можете использовать команду grep. Кроме того, вы можете использовать расширение параметра, чтобы получить заголовок:
ath=${TestString/(*)*}
year=$(grep -o '(.*)' <<<"$TestString")
auth=$(grep -o '\[.*\]' <<<"$TestString")
Это предполагает, что в названии никогда не будет скобок или квадратных скобок, год будет всегда заключен в круглые скобки, а автор будет всегда заключен в скобки. в скобках.
.
— это токен регулярного выражения, который соответствует «любому одиночному символу», добавление *
указывает, что он соответствует от нуля до неограниченного количества раз. Таким образом, он должен соответствовать буквально всему, что заключено в круглые скобки. Если вы хотите сузить круг, и ваш классный год всегда будет числом, вы можете сделать '([0-9]+)'
, что по-прежнему является широким решением, которое можно еще больше сузить с помощью дополнительной информации о входных данных.
Скобки нужно экранировать, потому что они создают класс символов в регулярном выражении, и мы хотим сопоставить их буквально.
С расширением параметра bash
:
# remove matching suffix ` (*`
ath="${TestString%% (*}"
# remove matching prefix `*) `
author="${TestString##*) }"
# remove matching prefix `*(`
classyear="${TestString##*(}"
# remove matching suffix ` [*` and add the missing `(`
classyear="(${classyear%% [*}"