我使用了一个循环,使用 Bash 创建了一组屏幕,这些屏幕连接到一组串行端口:
for i in $(ls /dev/ttyACM*)
do
screen -S ${i##*/} -L -d -m $i
done
随后,我想重复向所有这些屏幕发送重置命令,直到它们全部关闭(某些设备需要多次重置才能重新启动)。为此,我需要活动屏幕会话名称的列表。
不幸的是,像这样的命令for j in $(screen -ls); do echo $j; done
会返回以下内容:
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.
我想要的是这样的命令,它返回:
ttyACM6
ttyACM0
然后我就可以运行:
for i in $(<<magic stuff here>>)
screen -S ${i##*/} -X stuff 'reset^M'
done
直到没有更多的屏幕剩余。
谁能帮我解决<<这里的神奇东西>>吗?
答案1
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
分隔符设置为 a.
并返回字段 2,在本例中为 tty 值。
对于您的示例,这将返回:
ttyACM6
ttyACM0
答案2
虽然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