Из Lexico, сайта Оксфордского словаря:
source
VERB [WITH OBJECT]
- Obtain from a particular source.
Разве не это именно то, что делает эта команда? Получение определений переменных, псевдонимов и функций, а также других параметров оболочки из определенного файла?
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
Хотя 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