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


10

大多数情况下,命令的输出以换行符结束。但是有时却不是,因此下一个shell提示与输出一起打印在同一行中。

例:

root @ hostname [〜]#echo -n你好
helloroot @ hostname [〜]#

我总是觉得很烦。
现在,我可以在PS1变量的开头添加“ \ n”,但是大多数情况下,这将打印我不需要的额外一行。

是否可以知道最后一条命令的输出是否以换行符结尾?


解决方案:(
感谢丹尼斯)

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

这应该移到超级用户。
ℝaphink

我喜欢你的版本!您曾经$()在一个地方使用过,而在另一地方则使用了反引号。您可以$()在两者中使用。
暂停,直到另行通知。

我知道。但是对我来说,这样
读起来

我不会使用,tput cols因为无论如何它只会输出COLUMNS变量的值,并且速度较慢,因为它不是内置的shell。您还需要包含\e[K(相当于tput el)来删除插入的空格,以便在默认情况下复制和粘贴时不会出现一堆尾随空格。最后,您需要将所有这些魔咒放在之间\[\]否则bash会尝试猜测您的光标位置,并且在您编辑命令/历史记录时会弄乱。
dlitz

1
整个过程可以做到:PS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

Answers:


6

我一直在尝试以下方法以从zshBash中模拟该功能:

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

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

使用此功能取决于您的终端如何处理右边距换行(自动边距)。PROMPT_SP的长度是任意的,但至少应为80或通常的端子宽度是多少。如果在for运行循环时尚未设置$ COLUMNS,则可能需要对该值进行硬编码~/.bashrcshopt -s checkwinsize如果尚未设置,则可能需要。


我不知道为什么有人拒绝每个答案。嗯...没有解释。多么有帮助。
暂停,直到另行通知。

这是不使用循环而创建填充字符串的另一种方法:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
暂停,直到另行通知。

什么是“反向视频百分号”?“视频”一词让我感到困惑,而且我无法在Google上找到答案。
davidchambers

1
@davidchambers:角色的背景以前景色显示,而角色本身以背景色显示。请参阅man 5 terminfo并搜索“反向视频”,以查看一些使用此术语的文档。
暂停,直到另行通知。

0

不,这是不可能的。Bash本身不会处理或看不到它已启动的程序的输出。

在我看来,可能有可能编写一个要设置PROMPT_COMMAND为的程序,该程序将检查光标的当前位置并在光标不在左边缘时发出换行符。


好主意。唯一的问题是...是否可以知道光标位置?
GetFree

0

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

$ echo -n 'abc'
abc%
$ 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.