Tod*_*rry 2 bash gnu-screen sh
尝试通过“stuff”选项将长命令字符串传递到屏幕。当字符串很短并且存在于 bash 中时,在许多脚本中成功完成此操作,如下所示:
screen -d -m -S worker
screen -S worker -X -p 0 stuff $'/usr/bin/env python3 /root/worker.py\n'
Run Code Online (Sandbox Code Playgroud)
在本例中,我正在从文件中读取命令。我可以将 '\n' 附加到该文件,但 $ () 构造函数会吃掉换行符。我尝试过 printf、ISF= 和许多排列,但在我可以保留换行符的地方,不知何故该命令不会显示在屏幕上。
GEO_COMMAND=/foo/geo_command.txt
screen -S worker -X -p 0 stuff printf '%\n' "$GEO_COMMAND"
or
screen -S worker -X -p 0 stuff $GEO_COMMAND
Run Code Online (Sandbox Code Playgroud)
GEO_COMMAND: ''foo -bar -geo1 -geo2 -blah -keys ..... 160 个字符后 ...; /root/finish_job.sh\n '
答案在下面突出显示,为后代添加此内容:
screen 'stuff' 选项不喜欢大命令,并且对于换行符非常特殊。
下面的评论/答案解决了可靠的换行问题,但要粘贴/执行大型命令,答案是使用“readreg”通过命令读取文本文件,然后使用第二个命令“paste”将其传递到屏幕,如下所示如下所示。
这种方法不需要尾随换行符,不需要您用引号将命令(在文件中)括起来,并且也接受传导命令(; /foo/bar/sh)。
手册screen页建议stuff不应将其用于大字符串。作为替代方案,您可以将文件读入寄存器(一种缓冲区),然后粘贴它。这里p是任意寄存器:
screen -S worker -X readreg p /foo/geo_command.txt
screen -S worker -X paste p
Run Code Online (Sandbox Code Playgroud)
这种更直接的方法的优点是您不需要通过中间 shell 变量,如 中那样GEO_COMMAND="$(cat ...)",它会丢失最终的换行符。此外,数据不会被解释screen(例如,文件中的 2 个字符\n不会被 1 个字符换行符替换)。
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |