Как получить список имен сеансов экрана для цикла

Из Lexico, сайта Оксфордского словаря:

source

VERB [WITH OBJECT]

  1. Obtain from a particular source.

Разве не это именно то, что делает эта команда? Получение определений переменных, псевдонимов и функций, а также других параметров оболочки из определенного файла?

0
17.05.2021, 19:11
2 ответа

screen -ls распечатывает в формате

There are screens on:
    screen_name    (Status)
X Sockets in /path/to/screen/socket/dir

Ваш конкретный вывод, вероятно, выглядит примерно так:

There are screens on:
    33097.ttyACM6    (17.05.2021 18.53.46)   (Detached)
    33085.ttyACM0    (17.05.2021 18.53.46)   (Detached)
2 Sockets in /run/screen/S-keir.finlowbates.

Таким образом, когда написанный вами цикл for выполняет итерацию по этим значениям, он просто повторяет каждый элемент, разделенный пробелом.

Предполагая, что все ваши экраны будут соответствовать формату, который вы указали, и имеют связанный tty, тогда самый простой способ получить эту информацию — просто запустить screen -ls | grep "tty"| awk '{print $1}' | cut -d. -f 2.

screen -lsвозвращает результаты, показанные выше, grep ttyвозвращает только строки с tty в них, awk {print $1}печатает первый столбец в этой строке, а cut -d. -f2устанавливает разделитель как .и возвращает поле 2, которые в данном случае будут значениями tty.

Для вашего примера это вернет:

ttyACM6
ttyACM0
1
28.07.2021, 11:31

Хотя screenне возвращает аккуратно отформатированного результата, оказывается, что вы можете запросить файловую систему Linux, чтобы получить необходимую информацию:

ls /var/run/screen/S-${USER}

Это возвращает PID и имя сеанса экрана, например. 443653.ttyACM6 443818.ttyACM6. Хотя вы можете использовать подстановку, чтобы удалить все до точки включительно, оказывается, что вы можете повторно подключиться к сеансу экрана со всемPID.sessionName:

for i in $(ls /var/run/screen/S-${USER})
  do
    screen -r ${i} -X stuff 'reset^M'
  done
0
28.07.2021, 11:31

Теги

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