繁体   English   中英

将文字美元符号放入现有屏幕

[英]stuff literal dollar sign into existing screen

我有一个在后台运行的屏幕。 我想以编程方式向该屏幕发送命令。 我一直在这样做:

screen -x <screen.PID> -p 0 -X stuff 'echo $varname'

它一直工作正常。 但是我最近将我的screen版本从4.00.03升级到4.03.01并且相同的命令不再起作用。 现在, screen在打印之前拦截我的命令和 eval 的 shell 变量。 所以例如而不是发送

echo $varname

它会发送

echo var_value

如果$varname="var_value" 一种解决方案是在我的命令中转义$ - 这适用于较新版本的屏幕,但不适用于旧版本。 我想找到一个适用于所有版本的命令,因为我的脚本部署在许多机器上,我无法确定安装了哪个版本的screen (或者确切地在screen进行了此更改)。

一种解决方法是在$符号处拆分要发送到屏幕会话的字符串:

screen -x <screen.PID> -p 0 -X stuff 'echo $'
screen -x <screen.PID> -p 0 -X stuff 'varname'

我已经检查过这是否适用于屏幕版本4.03.01 ,但我不明白为什么它不适用于不尝试在stuff命令中扩展变量的其他版本。

编辑

字符串拆分可以自动进行,如下所示:

echo -n 'PUT YOUR STRING HERE' | {while read -r -d '$' x; do screen -x <screen.PID> -p 0 -X stuff "$x\$"; done; screen -x <screen.PID> -p 0 -X stuff "$x"; }

我的解决方案是构建一个根据屏幕版本是否需要转义而分支的条件。 假设您有一个屏幕,其中varname=1并且您想echo $varname 如果您将以下代码stuff到屏幕中,它将适用于两个版本的屏幕:

if [ -z $varname ];
then echo \$varname;
else echo $varname;
fi;

为什么有效:

在不需要 $ 转义的旧版屏幕上,条件[ -z $varname ]将评估为 false,因为$varname存在且不为空。 在较新版本的 screen 中, $varname将在条件语句之前解析,实际执行的语句是[ -z ] 这评估为真,因此执行第一个分支。

通过屏幕内容发送文字文本有很多问题,例如美元符号、抑扬符、反斜杠、引用以及屏幕侧的非常小的缓冲区大小。 这些都没有记录,与原始问题类似,我需要能够以这种方式为项目发送任意文本。 所以不久前我写了一个 Python 模块来处理所有情况,它可以通过泻湖项目中的 pip 获得,这里是一个 github 链接: https : //github.com/combatopera/lagoon/blob/master/screen .py

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM