Most of the time the output of a command ends with the newline character. But sometimes it does not, so the next shell prompt is printed in the same line together with the output.
Example:
root@hostname [~] # echo -n hello
helloroot@hostname [~] #
I've always found that very annoying.
Now, I could just add a "\n" at the beginning of the the PS1 variable, but most of the time that will print one extra line I dont need.
Is it possible to know whether the last command's output ended with a newline or not?
Solution:
(Thanks to Dennis)
PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '
I've been experimenting with the following to emulate the feature from
zsh
in Bash:It issues a reverse video percent sign, followed by a bunch of spaces to make it wrap to the next line, then a carriage return, followed by a dollar sign and a space. You can add prompt escapes after the "\015" to customize your prompt.
Using this depends on how your terminal handles right margin line wrapping (automatic margins). The length of PROMPT_SP is arbitrary, but should be at least 80 or whatever your usual terminal width is. You may need to hard-code that value if $COLUMNS isn't set yet by the time the
for
loop is run in~/.bashrc
. You may wantshopt -s checkwinsize
if it's not already set.No it isn't possible. Bash itself does not process or see the output of the program it has started.
It just occured to me that it might be possible to write a program to set
PROMPT_COMMAND
to, which would check the current position of the cursor and issue a newline if the cursor was not at the left edge.zsh
tries to solve your problem. If the last output ends without a newline, you will get:Where the
%
uses inverted background/foreground. Not sure if it's portable tobash
in any way.