所以我想做的是在远程服务器上显示图像并移动它们 - 我已经想到了一种使用wmctrl
ImageMagick实现这一点的方法display
,所以我写了一个简单的命令。
cat "$img" | ssh "beer@laika" "export DISPLAY=:0; display - & sleep 5 && wmctrl -r ImageMagick -e 0,254,600,800,560"
将、和文件作为输入$img
的变量在哪里——问题是上述方法似乎不起作用,错误是。png
jpeg
jpg
display: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
它似乎display
没有正确接受输入,我认为某些进程已经吸收了标准输入。
我尝试调试该命令,并发现如果在display -
删除之后执行的命令有效!图像将显示在我的远程服务器上。
cat "$img" | ssh "beer@laika" "export DISPLAY=:0; display -"
↑↑ 工作了 ↑↑
如果我通过 ssh 手动移动窗口,它将成功运行而不会出现任何问题。
ssh beer@laika "export DISPLAY=:0; wmctrl -r ImageMagick -e 0,254,600,750,480"
↑↑ 工作了 ↑↑
可能存在什么问题?有人能帮我解答一下吗?
答案1
问题出在标准输入上。
解决这个问题的一种方法是先传输文件(cat > filename
),然后运行命令,因此您的命令行将是这样的:
cat "$img" | ssh beer@laika "export DISPLAY=:0; cat > /tmp/temporary_image;display /tmp/temporary_image & sleep 5;wmctrl -r ImageMagick -e 0,254,600,750,480"
答案2
一般情况下,您不能将 stdin 发送到后台作业。如果进程以 开始,&
则 shell 实际上会将其 stdin 从 /dev/null 重定向,以避免任何读取尝试。
(并且该进程通常是从交互式终端启动的,但是稍后按 Ctrl+Z 并按 'bg' 时,每当它尝试从终端读取时都会收到 SIGTTIN。)
因此,您需要先将图像接收到临时文件中,或者用&
自定义工具替换用法。例如,使用 Python 中的“subprocess”模块或 Ruby 中的 Open3() - 它们可以让您更好地控制要传递哪些 FD。
可能可以从 shell 内部执行此操作,因为显式重定向会覆盖这一点:
display - < /dev/stdin &
实际上,最好预先指定位置并避免延迟移动。大多数 X11 程序传统上都接受该-geometry
选项,因此请检查这是否有效:
display -geometry "WIDTHxHEIGHT+XOFFSET+YOFFSET" -