从终端运行和用作快捷方式时命令显示不同的行为

从终端运行和用作快捷方式时命令显示不同的行为

我正在使用 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

KUbuntu 自定义快捷方式

它会截取屏幕截图但不会将文本保存在剪贴板中。 与双击相同的行为。

这里发生了什么?

答案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

相关内容