Tonin wskazał błąd w moim domyślnym pytaniu . Minimalny przykład:
Ustaw PS1:
PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ '
W tym momencie monit wygląda następująco:
$
Teraz uruchom kod wyjściowy, uruchamiając:
false
Teraz monit zawiera kod wyjścia w kolorze czerwonym na początku wiersza:
1 $
- Naciśnij Ctrl- r.
Wpisz „false”. Teraz monit zawiera tylko wyszukiwanie:
(reverse-i-search)`false': false
- Prasa Enter.
Wynikowa historia terminali zawiera teraz:
1 $ch)`false': false
Oczekiwany wynik:
1 $ false
Oznacza to, że wyniki wyszukiwania historii są pomieszane z pytaniem i ukrywają rzeczywiste polecenie, które zostało uruchomione.
Próbowałem obejść ten problem, używającPROMPT_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
To wydaje się nie działać - linia wygląda dokładnie tak samo jak przedtem po wyszukiwaniu i uruchomieniu.
Jak mogę to naprawić?
Odpowiedzi:
Odpowiedź znalazłem na askubuntu.com . @qeirha wspomniał, że musisz powiedzieć bashowi, że sekwencja znaków nie powinna być liczona w długości monitu, a robisz to, dołączając ją
\[
\]
. Na podstawie podanego przykładu, oto jedno rozwiązanie:źródło
PS1
kodem, dlaczego go nie widziałem?(Przepraszamy, brak tutaj wyjaśnień. Zobacz Jak prawidłowo dostosować PS1? Lub inne pytanie dotyczące problemów z szybkim obliczaniem długości i
\[
...\]
).źródło
\[...\]
działa dobrze, o ile możesz umieścić cały kod, który chcesz wygenerować, w jednym ciągu. Jeśli jednak chcesz podzielić swój kod na małe funkcje, dochodzisz do punktu, w którym nie możesz umieścić nawiasów początkowych i końcowych w tym samym łańcuchu / funkcji. I to przerywa zawijanie linii. Chyba że użyjeszPROMPT_COMMAND
do ponownego obliczeniaPS1
przy każdym monicie.Rozwijając odpowiedź @manatwork, ale utrzymując kod dzielący
PS1
obliczenia na różne funkcje, możesz napisać swój monit w następujący sposób:Podwójne cudzysłowy są obowiązkowe zarówno podczas ustawiania, jak
PS1
i używaniaprintf
w funkcji.źródło
.bashrc
- nie umieszczaj kodu w osobnym pliku i nie wywołuj tego.