我有一个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循环来等待,直到用户没有拖动文件或目录,并根据它做不同的事情。
但是,这并不能解决复制/粘贴问题