东西字面美元符号到现有的屏幕

时间:2018-05-18 20:43:56

标签: bash gnu-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(或者在{{1 }})。

3 个答案:

答案 0 :(得分:2)

解决方法是将要发送的字符串拆分为$符号的屏幕会话:

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

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

修改

字符串拆分可以按如下方式自动完成:

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"; }

答案 1 :(得分:1)

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

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

为什么会这样:

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

答案 2 :(得分:0)

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