W większości przypadków wyjście polecenia kończy się znakiem nowej linii. Ale czasami tak nie jest, więc następny monit powłoki jest drukowany w tym samym wierszu wraz z wyjściem.
Przykład:
root @
nazwa hosta [~] # echo -n hello helloroot @ nazwa hosta [~] #
Zawsze uważałem to za bardzo denerwujące.
Teraz mógłbym po prostu dodać „\ n” na początku zmiennej PS1, ale przez większość czasu wydrukuje jedną dodatkową linię, której nie potrzebuję.
Czy można wiedzieć, czy wyjście ostatniego polecenia zakończyło się znakiem nowej linii, czy nie?
Rozwiązanie:
(Dzięki Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
$()
w jednym miejscu, a backty w innym. Możesz używać$()
obu.tput cols
ponieważ i tak wyświetla wartość zmiennej COLUMNS, i jest wolniejszy, ponieważ nie jest wbudowany w powłokę. Będziesz także chciał uwzględnić\e[K
(równoważnetput el
), aby usunąć wstawioną białą spację, aby nie dostać wiązki końcowych białych spacji podczas kopiowania i wklejania w przypadku domyślnym. Wreszcie, musisz zamknąć całą tę magię pomiędzy\[
i,\]
inaczej bash spróbuje odgadnąć twoją pozycję kursora i będzie bałagan, kiedy edytujesz swoje polecenie / historię.PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
Odpowiedzi:
Eksperymentowałem z następującymi elementami, aby emulować tę funkcję
zsh
w Bash:Wydaje odwrotny znak procentu wideo, a następnie kilka spacji, aby zawinąć do następnej linii, następnie znak powrotu karetki, a następnie znak dolara i spację. Możesz dodać znaki zachęty po „\ 015”, aby dostosować monit.
Korzystanie z tego zależy od tego, jak terminal obsługuje owijanie prawego marginesu (automatyczne marginesy). Długość PROMPT_SP jest dowolna, ale powinna wynosić co najmniej 80 lub jakąkolwiek zwykłą szerokość terminala. Może zajść potrzeba zakodowania tej wartości, jeśli $ COLUMNS nie jest jeszcze ustawione do czasu uruchomienia
for
pętli~/.bashrc
. Możesz chcieć,shopt -s checkwinsize
jeśli nie jest jeszcze ustawiony.źródło
printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
man 5 terminfo
i wyszukaj „wideo odwrócone”, aby zobaczyć dokumentację używającą tej terminologii.Nie, to nie jest możliwe. Sam Bash nie przetwarza ani nie wyświetla danych wyjściowych uruchomionego programu.
Właśnie przyszło mi do głowy, że może być możliwe napisanie programu do ustawienia
PROMPT_COMMAND
, który sprawdzałby bieżącą pozycję kursora i wydawał nowy wiersz, gdyby kursor nie znajdował się na lewej krawędzi.źródło
zsh
próbuje rozwiązać problem. Jeśli ostatnie wyjście zakończy się bez nowej linii, otrzymasz:Gdzie
%
wykorzystuje odwrócone tło / pierwszy plan. Nie jestem pewien, czy jestbash
w jakikolwiek sposób przenośny .źródło