运行包含带有屏幕的 STDIN 重定向的命令

Posted

技术标签:

【中文标题】运行包含带有屏幕的 STDIN 重定向的命令【英文标题】:Running a command that includes an STDIN redirect with screen 【发布时间】:2021-08-28 09:25:41 【问题描述】:

使用Gradle SSH plugin 我将.jar 文件部署到另一台机器。

然后我想在一个独立的screen 会话中运行那个 jar。 如果应用程序不需要在 STDIN 上输入,这将不是问题,运行 screen -dmS screen-name java -jar my.jar

我尝试使用 here-string 以下列方式提供输入(除了其他方法),但我没有让其中任何一个工作:

screen -dmS screen-name java -jar my.jar <<< "firstInputLine
SecondInputLine
"

谁能指出我正确的方向?谢谢!

【问题讨论】:

【参考方案1】:

我认为您的问题是您正在将输入传递给 screen 命令,而不是实际传递给 java 进程。我会这样做:

    使用您的输入创建一个文件,类似于echo "foo" &gt; input.txt scp该文件到机器 运行screen 命令并使java 进程直接读取文件(如果该程序可以这样做)或通过运行bash 命令而不是直接运行java 命令正确地管道它。类似于screen -dmS screen-name bash \"cat input.txt | java -jar ...\"

免责声明:上述转义只是近似于我的观点;-)

【讨论】:

我更喜欢不需要手动创建文件的解决方案,但您使用 bash 的提示可能会有所帮助。我只是在努力逃避一切……【参考方案2】:

我目前解决了这个问题,首先创建分离的screen 会话,然后使用第二个screen 调用,使用屏幕的stuff 命令转发输入,不再使用here-string:

screen -dmS screen-name java -jar my.jar && 
screen -S screen-name -p 0 -X stuff "firstInputLine^MsecondInputLine^M"

(^M 被解释为 ENTER)

【讨论】:

以上是关于运行包含带有屏幕的 STDIN 重定向的命令的主要内容,如果未能解决你的问题,请参考以下文章

Shell 输入/输出重定向

Linux 重定向与管道符

Linux管道符和重定向与环境变量

输入输出重定向

Linux用户

linux中的管道符重定向于环境变量