屏幕和脚本之间的沟通

屏幕和脚本之间的沟通

我想编写一个脚本,启动一个进程screen,让它继续运行,但提取输出的某一部分以供脚本的主进程使用。

我的第一个想法是使用命名管道在两个进程之间进行通信。但是,使用实际的命名管道只会导致脚本永远挂起——屏幕启动并运行良好,我稍后可以访问它,但终端进程只是挂起而不返回:

pipe=/tmp/fwdpipe$$
trap "rm -f $pipe" exit

mkfifo $pipe

server=$(cat $pipe) &

screen -dmS jupyter
screen -S jupyter -X stuff "cat foo" > $pipe\015"

wait
echo $server

(背景和等待模式是一个实验;如果我将该server=行移到末尾,问题仍然存在。)

如果我改用普通文件,则会cat抱怨文件不存在。无论哪种方式,我似乎都无法实现在screen.

答案1

您应该screen在读取之前启动命令fifo。此示例将列出中的当前目录,screen并且不存在的路径错误将重定向到 fifo。

#!/bin/bash  
  
[[ -p screen.fifo ]] \  
|| mkfifo -m 660 screen.fifo  
  
exec 3<>screen.fifo

session=test  

screen -ls $session >&- || screen -dmS $session  
screen  -S $session \  
        -X stuff 'ls \$PWD nonexistent 2> screen.fifo\n' &  
  
while IFS= read -r -u 3; do  
echo REPLY: $REPLY  
done

您还可以使用tee以下方法写入screenfifo:

#!/bin/bash

[[ -p screen.fifo ]] \
    || mkfifo -m 660 screen.fifo

session=test

screen -ls $session >&- || screen -dmS $session
screen  -S $session \
        -X stuff "printf '%s\\\n%s\\\n' hello world | tee screen.fifo\n"

text="$(cat < screen.fifo)"
echo "$text"

相关内容