如何防止用户在read-n命令期间拖动文件作为输入



我有一个bash脚本,它要求用户从一些菜单屏幕中选择单键输入。我使用read -n 1 -s -r -p '',然后根据通过一小组if语句传递的用户输入进行操作。

我需要能够防止用户意外地拖动作为读取命令输入的文件。我非常愿意替换read命令,这样我就可以防止这个用户操作中断进程,但我需要它与大多数shell兼容。

现在,正如人们所期望的那样,拖动文件会进入终端中的文件路径,因此shell将其视为用户实际按下了键。

我不希望用户能够使用复制/粘贴或拖动文件来响应读取提示。

这可能吗?我不介意它是否复杂,可能不值得;无论如何我都会实现它,我确信:d

我不熟悉官方的shell名称,但我希望它至少与Mac OSX终端和Ubuntu兼容。

我认为没有办法阻止复制/粘贴(或等效的文件拖动(。此服务由窗口管理器提供,不受应用程序控制。

也就是说,考虑使用纯bash实现刷新——在提示用户输入之前和获取数据之后刷新缓冲区。这可以通过强制读取超时来完成。

该解决方案还将防止从管道或类似的/文件向程序提供输入。我将让OP来决定是否需要这样做。

# Read all pending input
while read -t 0.1 ; do : ; done
# Read input
read -n 1 -s -r -p ''
# Consume any remaining input
while read -t 0.1 ; do : ; done

部分答案(停止用户在文件或目录中拖动,但不停止复制/粘贴(

可能还有一种更可靠、更实用的方法,但我不知道。

受@user1934428关于清空键盘缓冲区的建议的启发,我在reddit上看到了一篇帖子,其中包含清除缓冲区的Perl命令。我做了一些尝试和错误,发现这是完美的工作:

read -n 1 -s -r -p '' && perl -e 'use POSIX; tcflush(0, TCIFLUSH);'
while [[ "$REPLY" == *"/"* ]] || [ "$REPLY" = "" ]; do
read -n 1 -s -r -p '' && perl -e 'use POSIX; tcflush(0, TCIFLUSH);'
done

清除缓冲区后,$REPLY在文件的内存中会留下一个"/",在目录中则为空。

这使我可以使用while循环来等待,直到用户没有拖动文件或目录,并根据它做不同的事情。

但是,这并不能解决复制/粘贴问题

相关内容

  • 没有找到相关文章

最新更新