我正在使用 KUbuntu 18.04.1
我正在尝试使用 spectacle(KUbuntu 的截图应用程序)和 gocr(OCR 工具)从截图中提取文本
如果我在 Konsole (KUbuntu 的终端)中一个接一个地给出命令
第一的:
spectacle -r -b -n -o /home/UserName/Documents/Translate/input.jpg
第二:
gocr -i /home/UserName/Documents/Translate/input.jpg | xsel -b
有用。
如果我创建一个 bash 文件屏幕并输入代码
#!/bin/bash
# Dependencies: gocr xsel
# Take Screenshot and Save it to a File
spectacle -r -b -n -o /home/UserName/Documents/Translate/input.jpg
# Extract text from the saved file
gocr -i /home/UserName/Documents/Translate/input.jpg | xsel -b
exit
打开 Konsole 并输入./screen_ts.sh,有用
但是,如果我使文件可执行并双击,它会截取屏幕截图但不会将文本保存在剪贴板中。
如果我再次使用创建自定义快捷方式
自定义快捷方式 > 触发器Alt + Q
和操作/home/UserName/Documents/Translate/screen_ts.sh
它会截取屏幕截图但不会将文本保存在剪贴板中。 与双击相同的行为。
这里发生了什么?
答案1
从人xsel:
默认情况下,如果标准输入和标准输出都是终端 (ttys),则此程序将不加修改地输出选择。否则,如果标准输出不是终端 (tty),则输出当前选择;如果标准输入不是终端 (tty),则从标准输入设置选择。如果给出了任何输入或输出选项,则程序仅在请求的模式下运行。
这有点误导,但源代码:
检查 stdin/stdout 是否为 tty 并不能可靠地判断用户想要什么。这是因为子进程继承了其父进程的文件描述符;在脚本中调用的 xsel,例如守护进程(未附加到 tty),或使用重定向或在管道中调用的 xsel,默认情况下将具有非 tty 文件描述符。重定向/管道问题也适用于 shell 中的“分组”或“复合”命令(函数、子 shell、花括号块、条件、循环等)。在所有这些情况下,用户必须明确设置操作模式。
...这就是解决方案:通过添加选项xsel
明确告诉读取:stdin
-i
gocr -i /home/UserName/Documents/Translate/input.jpg | xsel -b -i