Вы должны иметь графический интерфейс или терминал для ввода данных пользователем. Если пользователь открывает сценарий, скажем, Nautilus, нет стандартного ввода, поэтому read сразу возвращается. Одним из возможных решений было бы заставить скрипт открыть новый терминал и выполнить себя в нем следующим образом:
x-terminal-emulator -e $0
С x-терминал-эмулятором вызывается терминал-эмулятор по умолчанию. Это работает с Debian & Ubuntu, я не знаю о других дистрибутивах.
Разумеется, вы можете вызвать конкретный терминал, например, xterm, konsole или любой другой терминал.
$0
- это путь к файлу скрипта, так что это всегда работает.
Вы также должны убедиться, что он не рекурсивно открывает больше терминалов. Один из способов, которым это может сработать, - проверить, можете ли вы читать со стандартного ввода, как вы это уже делаете:
Код возврата команды чтения равен нулю, если только не встречается символ конца файла, если время чтения истекло или если в качестве аргумента для опции -u указан неверный дескриптор файла.
Поэтому проверьте возвращаемое значение, если оно есть!= 0, открыть новый терминал, как указано выше, в противном случае нет.
Пример:
#!/bin/bash
read -p "Enter first value: " first
# Check return value of last command with $?
if [[ $? != 0 ]]; then
x-terminal-emulator -e $0
else
echo $first
read -p "Enter more: " more
echo $more
fi
Посмотрите этот вопрос, если вам нужно держать терминал открытым после завершения программы.