Придите последними строка сообщения об ошибке как команда

Можно использовать 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 вызовы, но Вы, вероятно, найдете его функциональность истории слишком ограниченной (т.е. почти не существующий).

2
06.11.2013, 23:30
2 ответа

Можно включить его путем добавления этого к Вашему .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

/или выезд сам сценарий.

5
27.01.2020, 21:54

Нет никакого пути вокруг этого к моему знанию. У Вас есть 2 опции:

  1. введите его
  2. копия и вставка это (который технически вводит его),

автосклонный

Как 3-й подход можно использовать инструмент auto-apt.

   $ auto-apt run <command_string>

При вызове автоспособная команда автоматически устанавливает пакеты на пропавших без вести доступа к файлу. Если программа попытается получить доступ к файлу, который, как известно, принадлежал удаленного пакета, то автосклонный установит тот пакет, использующий склонный - добираются. Эта функция требует склонный и sudo работать.

Но снова этот метод не приводит Ваш "ввод к сбою" требование.

Другие идеи

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

Можно было, вероятно, подробно остановиться на этих правилах или возможно 1 правиле, так, чтобы apt-get -y install <package X> выполнения автоматически.

1
27.01.2020, 21:54
  • 1
    поместил его в сценарий запуска. затем Вы не должны вводить, если я не неправильно понимаю (правовая оговорка: Я ни на что на самом деле не посмотрел кроме этого ответа) –  strugee 07.11.2013, 00:39
  • 2
    @strugee - он хочет его к автоматической установке после того, как завершение решает, что он не установлен. –  slm♦ 07.11.2013, 00:41

Теги

Похожие вопросы