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żne tput 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]\$ '