Как предотвратить перетаскивание пользователем файла в качестве ввода во время чтения -n команды - PullRequest
0 голосов
/ 27 марта 2020

У меня есть скрипт bash, который запрашивает у пользователя одноклавишный ввод для выбора из некоторых экранов меню. Я использую read -n 1 -s -r -p '', а затем делаю что-то на основе ввода пользователя, пропущенного через небольшой набор операторов if.

Мне нужно иметь возможность предотвратить случайное перетаскивание пользователем файла, выполняющего роль ввода к команде чтения. Я очень открыт для замены команды read, чтобы затем позволить мне предотвратить прерывание процесса этим действием пользователя, но мне нужно, чтобы это было совместимо с большинством оболочек.

Прямо сейчас, как и следовало ожидать при перетаскивании файла вводится путь к файлу в терминале, и поэтому оболочка обрабатывает его так, как будто пользователь фактически нажал клавиши.

Я не хочу, чтобы пользователь мог использовать копирование / вставку или перетаскивание в файл как способ ответить на приглашение на чтение.

Возможно ли это? Я не против, если это сложно и, вероятно, не стоит того; В любом случае, я бы это реализовал: D

Я не знаком с официальными именами оболочек, но хочу, чтобы он был хотя бы совместим с Ma c OSX Terminal и Ubuntu.

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Я не верю, что есть способ предотвратить копирование / вставку (или эквивалентное перетаскивание файлов). Эта услуга предоставляется оконным менеджером и не контролируется приложениями.

Тем не менее рассмотрите возможность выполнения очистки с использованием чистого bash - flu sh буфера ДО запроса пользователя для ввода и после принимая данные. Это можно сделать, установив таймаут для чтения.

Решение также предотвратит подачу программы с вводом из канала или аналогичного файла / файла. Я оставлю это на усмотрение ОП, чтобы решить, если это желательно.

# 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
0 голосов
/ 28 марта 2020

ЧАСТИЧНЫЙ ОТВЕТ (останавливает перетаскивание пользователя в файл или каталог, но не копирует / вставляет)

Возможно, существует более надежный и функциональный метод, но я понятия не имею.

Вдохновленный предложением @ 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 оставался с "/" в памяти из файла и оставлялся пустым из каталога .

Это позволяет мне использовать это время, пока l oop, ждать, пока пользователь не перетащил файл или каталог, и делать разные вещи, основываясь на которых.

Однако это не решает проблему копирования / вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...