Можно использовать rlwrap
для этого, если Вы не возражаете устанавливать программное обеспечение.
Вы, вероятно, захотите сохранить отдельный файл истории, который только поддерживает историю для конкретной подсказки в Вашем сценарии (т.е. постарайтесь не смешиваться с историей команд оболочки пользователя).
Вот пример, который мог бы работать на Вас:
#!/bin/sh
# Save in rlwrap_example.sh
HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"
$ ./rlwrap_example.sh
hello
User said hello
В вышеупомянутом сценарии пользователь может использовать весь GNU readline функциональность с историей, врученной от — и сохраненный в — ~/.myscript_history
. Настройте по мере необходимости.
С другой стороны, можно использовать удар read -e
, который включает readline для read
вызовы, но Вы, вероятно, найдете его функциональность истории слишком ограниченной (т.е. почти не существующий).
Можно включить его путем добавления этого к Вашему .bashrc
export COMMAND_NOT_FOUND_INSTALL_PROMPT=1
Предоставление Вас:
$ foo
The program 'foo' is currently not installed. You can install it by typing:
sudo apt-get install blah-blah
Do you want to install it? (N/y)
Если Вы получаете ошибку Python как в:
...
File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 217, in install_prompt
answer = answer.decode(sys.stdin.encoding)
AttributeError: 'str' object has no attribute 'decode'
Вы можете:
Примените этот патч для Ubuntu отсюда.
или:
Изменить CommandNotFound.py
путем добавления четырех пробелов в начале строк 215,216,217 (примечание: не вкладки):
... 213 else: 214 answer = raw_input(prompt) 215 4 spaces if sys.stdin.encoding and isinstance(answer, str): 216 4 spaces # Decode the answer so that we get an unicode value 217 4 spaces answer = answer.decode(sys.stdin.encoding) 218 if answer.lower() == _("y"): ...
Иначе, подробно остановиться на комментарии Greg Hewgill могло быть:
$(!! 2>&1 | tail -n1)
Я пытался перенести его в сценарий, но это не работало из поля, поскольку Вы не получите сообщение об ошибке.
Если Вы хотите добраться, это в сценарии, скорее hacky путь могло бы быть:
x=$(/usr/lib/command-not-found $(tail -n1 "$HOME/.bash_history") 2>&1 | tail -n1)
echo "$x"
Поскольку некоторые опции смотрят на:
/usr/lib/command-not-found -help
/или выезд сам сценарий.
Нет никакого пути вокруг этого к моему знанию. У Вас есть 2 опции:
Как 3-й подход можно использовать инструмент auto-apt
.
$ auto-apt run <command_string>
При вызове автоспособная команда автоматически устанавливает пакеты на пропавших без вести доступа к файлу. Если программа попытается получить доступ к файлу, который, как известно, принадлежал удаленного пакета, то автосклонный установит тот пакет, использующий склонный - добираются. Эта функция требует склонный и sudo работать.
Но снова этот метод не приводит Ваш "ввод к сбою" требование.
Я верю средству, которое предоставляет рекомендацию установить gparted
связывается в оболочку с помощью инструмента, названного завершением. Существуют правила, что можно подробно остановиться так, чтобы различные операции произошли, когда эти правила подобраны.
Можно было, вероятно, подробно остановиться на этих правилах или возможно 1 правиле, так, чтобы apt-get -y install <package X>
выполнения автоматически.