将文字美元符号填充到现有屏幕中
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
拦截了我的命令,并在打印之前评估了 shell 变量。因此,例如而不是发送
echo $varname
它将发送
echo var_value
如果$varname="var_value"
。一种解决方案是在我的命令中转义 $
——这适用于较新版本的屏幕,但它不适用于旧版本。我想找到一个适用于所有版本的命令,因为我的脚本部署在许多机器上,我无法确定安装了哪个版本的 screen
(或者在 [=11 中进行此更改的确切时间) =]).
解决方法是在 $
符号处拆分要发送到屏幕会话的字符串:
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 ]
。这评估为真,因此第一个分支被执行。
通过屏幕内容发送文字文本有很多问题,例如美元符号、抑扬符、反斜杠、引号,以及屏幕端的缓冲区大小非常小。 None 已记录,与原始问题类似,我需要能够以这种方式为项目发送任意文本。所以不久前我写了一个 Python 模块来处理所有情况,它可以通过泻湖项目中的 pip 获得,这里是 github link: https://github.com/combatopera/lagoon/blob/master/screen.py
我在后台有一个屏幕 运行。我想以编程方式向该屏幕发送命令。我一直这样做:
screen -x <screen.PID> -p 0 -X stuff 'echo $varname'
它一直运行良好。但是,我最近将我的 screen
版本从 4.00.03
升级到 4.03.01
并且相同的命令不再有效。现在,screen
拦截了我的命令,并在打印之前评估了 shell 变量。因此,例如而不是发送
echo $varname
它将发送
echo var_value
如果$varname="var_value"
。一种解决方案是在我的命令中转义 $
——这适用于较新版本的屏幕,但它不适用于旧版本。我想找到一个适用于所有版本的命令,因为我的脚本部署在许多机器上,我无法确定安装了哪个版本的 screen
(或者在 [=11 中进行此更改的确切时间) =]).
解决方法是在 $
符号处拆分要发送到屏幕会话的字符串:
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 ]
。这评估为真,因此第一个分支被执行。
通过屏幕内容发送文字文本有很多问题,例如美元符号、抑扬符、反斜杠、引号,以及屏幕端的缓冲区大小非常小。 None 已记录,与原始问题类似,我需要能够以这种方式为项目发送任意文本。所以不久前我写了一个 Python 模块来处理所有情况,它可以通过泻湖项目中的 pip 获得,这里是 github link: https://github.com/combatopera/lagoon/blob/master/screen.py