【发布时间】:2021-06-03 17:43:20
【问题描述】:
试图通过“stuff”选项将长命令字符串传递给 Screen。当字符串很短并且存在于 bash 中时,已经在许多脚本中成功完成此操作,如下所示:
screen -d -m -S worker
screen -S worker -X -p 0 stuff $'/usr/bin/env python3 /root/worker.py\n'
在这种情况下,我正在从文件中读取命令。我可以将 '\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
GEO_COMMAND: ''foo -bar -geo1 -geo2 -blah -keys ..... 160 个字符后 ...; /root/finish_job.sh\n '
答案在下面突出显示,为后代添加:
screen 'stuff' 选项不喜欢大型命令,并且对换行非常特别。
下面的评论/答案解决了可靠的换行问题,但要粘贴/执行大命令,答案是使用“readreg”通过命令读取文本文件,然后使用第二个命令“粘贴”将其传递到屏幕',如下所示。
这种方法不需要尾随换行符,不需要您将命令(在文件中)用引号括起来,并且也将接受传导命令 (; /foo/bar/sh)。
【问题讨论】:
-
您可以简单地通过并置字符串来连接它们;每个字符串都可以使用不同的引用风格。例如,
screen ... "$GEO_COMMAND"$'\n' -
请把它放在问题中。
-
类似于
GEO_COMMAND="..."$'\n'。您实际上并没有在值中添加换行符,只是一个由反斜杠和n组成的有向图。 -
已添加 - 对此感到抱歉。串联有助于可靠地添加换行符以执行命令。奇怪的是,该命令现在还导致 bash 在屏幕上抛出错误:没有这样的文件或目录。如果我复制/粘贴相同的命令,它会在该屏幕中执行而没有错误 = 对我来说没有意义
-
你能解释一下
GEO_COMMAND = /foo/geo_command.txt吗?随着=周围的空格,bash 将寻找一个名为 GEO_COMMAND 的命令,因此GEO_COMMAND=/foo/geo_command.txt可能会更好。但是,我认为您想要添加文件的内容,我认为您想要GEO_COMMAND=$(cat /foo/geo_command.txt)或没有附加变量screen -S worker -X -p 0 stuff $(cat /foo/geo_command.txt)。
标签: bash sh gnu-screen