Bash:如何知道最后一个命令的输出是否以换行符结束?

大多数情况下,命令的输出以换行符结束。 但是有时候它不会,所以下一个shell提示符和输出一起被打印在同一行。

例:

root @ hostname [〜]#echo -n hello
helloroot @主机名[〜]#

我一直觉得很烦人
现在,我可以在PS1variables的开头添加一个“\ n”,但是大部分时间会打印一个额外的行,我不需要。

是否有可能知道最后一个命令的输出是否以换行结束?


解:
(感谢丹尼斯)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ ' 

我一直在尝试以下方法来模拟Bash中zsh的function:

 $ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done $ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ ' 

它发出一个反向video百分号,然后是一堆空格,以便换行到下一行,然后是一个回车符,后跟一个美元符号和一个空格。 您可以在“\ 015”之后添加提示转义以自定义您的提示。

使用这取决于您的terminal如何处理右边界线换行(自动边距)。 PROMPT_SP的长度是任意的,但是至less应该是80或者任何通常的terminal宽度。 如果在~/.bashrc运行for循环时尚未设置$ COLUMNS,则可能需要对该值进行硬编码。 如果尚未设置,您可能需要shopt -s checkwinsize

不,这是不可能的。 Bash本身不处理或看到它已经开始的程序的输出。

刚刚发生了这样的情况:编写一个程序来设置PROMPT_COMMAND ,它将检查光标的当前位置,如果光标不在左边,则发出一个换行符。

zsh试图解决你的问题。 如果最后一个输出没有换行符结束,您将得到:

 $ echo -n 'abc' abc% $ 

%使用反转的背景/前景。 不知道它是否可移植到任何方式bash