Тонин указал на ошибку в моей подсказке по умолчанию . Минимальный пример:
Установите PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
На этом этапе подсказка выглядит так:
$
Теперь запустите вывод кода выхода, выполнив:
false
Теперь подсказка содержит код завершения красным цветом в начале строки:
1 $
- Нажмите Ctrl- r.
Типа "ложь". Теперь подсказка содержит только поиск:
(reverse-i-search)`false': false
- Нажмите Enter.
Полученная история терминала теперь содержит следующее:
1 $ch)`false': false
Ожидаемый результат:
1 $ false
Таким образом, кажется, что результаты поиска в истории смешаны с подсказкой и скрывают фактическую команду, которая была выполнена.
Я попытался обойти это с помощьюPROMPT_COMMAND
:
set_exit_code() {
exit_code=$?
[[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " "
}
set_bash_prompt() {
PS1='$(set_exit_code)$ ' # Double quotes give the same result
}
PROMPT_COMMAND=set_bash_prompt
Похоже, это не работает - после поиска и запуска строка выглядит точно так же, как и раньше.
Как я могу это исправить?
Ответы:
Я нашел ответ на askubuntu.com . @qeirha упомянул, что вы должны сказать bash, что последовательность символов не должна учитываться в длине приглашения, и вы делаете это, заключая ее в
\[
\]
. Основываясь на приведенном примере, вот одно решение:источник
PS1
кода, почему я ее не увидел?(Извините, здесь нет объяснения. См. Как правильно настроить PS1? Или любой другой вопрос о проблемах с расчетом длины строки и
\[
...\]
)источник
\[...\]
работает нормально, если вы можете поместить весь код, который вы хотите сгенерировать, в одну строку. Однако, если вы хотите разделить ваш код на маленькие функции, вы попадаете в точку, где вы не можете поместить начальную и конечную скобки в одну строку / функцию. И это нарушает перенос строк. Если вы не прибегаете к использованиюPROMPT_COMMAND
для пересчета вашегоPS1
при каждом запросе.Расширяя ответ @manatwork, но сохраняя код, разделяющий
PS1
вычисления в разных функциях, вы можете написать приглашение следующим образом:Двойные кавычки обязательны как при настройке, так
PS1
и при использованииprintf
в функции.источник
.bashrc
- не помещайте код в отдельный файл и вызывайте его.