8

我想在我的 bash 提示之后和我的 Mac 上的输出之前有一个空行。它应该看起来像这样:

echo; ls

我可以在我的 bash 提示符中添加一个换行符,然后返回一行等待用户输入吗?我有什么明显的遗漏吗?

4

7 回答 7

11

我知道这是旧的,但对于像我这样在谷歌搜索时遇到这个的人来说。这就是你这样做的方式......它实际上很简单!

查看此链接 -->光标移动

基本上向上移动 N 行:

echo -e "\033[<N>A HELLO WORLD\n"

只需将“ < N > ”更改为您想要返回的行数......例如,向上移动 5 行将是“/033 [5A”

于 2012-10-22T20:30:40.350 回答
4

据我所知,除非你深入研究更底层的东西,比如全屏模拟器,比如 curses,否则这是不可能的。

于 2008-11-10T16:42:11.323 回答
3

这有点像在黑暗中刺伤,但您可以使用VT102 终端代码来控制光标,而无需使用 Curses。您感兴趣的相关 VT102 命令都包括发送 ESC,然后是 [,然后是特定的命令参数。

例如,要将光标向上移动一行,需要输出:

ESC  [    1    A
0x1B 0x5B 0x31 0x41

请注意,VT102 文档通常使用八进制,因此如果您使用十六进制,请随身携带一个ascii 表。

所有这些建议都是在未经测试的情况下给出的——我不知道是否可以将 VT102 命令嵌入到您的 bash 提示符中,但我认为这可能值得一试。

编辑:是的——看起来很多人在他们的 bash 提示中使用 VT102 格式化代码。要将上面的示例翻译成 Bash 可以识别的内容,请输入:

\e[1A

进入您的提示应该将光标向上移动一行。

于 2008-11-10T16:46:28.333 回答
2

这是很有可能的。如果您的 bash 已C-v设置为 readlinequoted-insert 命令,您只需将以下内容添加到您的~/.inputrc

RETURN: "\C-e\C-v\n\C-v\n\n"

这将使 bash(实际上是 readline)在常规解释换行符之前插入两个逐字换行符。默认情况下,只插入一个,这就是导致输出在提示后的行开始的原因。

您可以测试是否C-v设置为quoted-insert,方法是在bash(即Ctrl+V)中键入它,然后是向上箭头。这应该打印^[[A或类似的东西。如果没有,您也可以将其绑定~/.inputrc

C-v: quoted-insert
RETURN: "\C-e\C-v\n\C-v\n\n"

~/.inputrc如果不存在可以创建。C-x C-r除非您发出 readline re-read-init-file 命令(默认为 on ),否则更改不会在运行 bash 时生效。不过要小心。如果你做错了什么,enter 将不再发出命令,而且修复你的错误可能会很困难。如果您做错了什么,C-o默认情况下也会接受该行。

添加换行符然后将光标移回常规提示符(如您所描述的)是可能的,但不会产生您想要的效果。您插入的换行符只会被应用程序输出覆盖,因为您将光标移回了它的前面。

于 2009-05-13T13:38:06.253 回答
2

这有效:

trap echo DEBUG

如果您在空提示下按回车,它不会添加额外的换行符。

上面的命令将导致为管道或多命令行的每个成员输出一个换行符,例如:

$ echo foo; echo bar
\n
foo
\n
bar

为了防止这种情况,在所有命令输出之前只输出一个额外的换行符:

PROMPT_COMMAND='_nl=true'; trap -- '$_nl && [[ $BASH_COMMAND != $PROMPT_COMMAND ]] && echo; _nl=false' DEBUG

陷阱在每个命令之前执行,DEBUG因此在第一个命令之前它检查标志是否为真,如果是,则输出换行符。然后它将标志设置为 false,因此该行之后的每个命令都不会触发额外的换行符。

的内容$PROMPT_COMMAND在提示输出之前执行,因此标志设置为真 - 为下一个周期做好准备。

因为在空命令行上按 enter 仍会触发陷阱中测试内容的执行,也会将这些内容作为当前命令检查,如果它们匹配$PROMPT_COMMAND则不执行。echo

于 2010-08-02T23:53:32.470 回答
1

I believe (but haven't tried) if you put '\n\b' in the prompt string it would do that.

于 2008-11-10T17:06:56.327 回答
0

一般来说,如果你想找出终端可以做的任何事情的代码,请阅读terminfo手册页。

在这种情况下,光标向上一行代码可以通过以下方式确定:

tput cuu1

如果将 tput 输出重定向到文件,则可以查看使用了哪些控制字符。

Bash 还支持 PROMPT_COMMAND 变量,允许您在发出每个提示之前运行任意命令。

于 2009-06-10T18:05:09.443 回答