我想在我的 bash 提示之后和我的 Mac 上的输出之前有一个空行。它应该看起来像这样:
echo; ls
我可以在我的 bash 提示符中添加一个换行符,然后返回一行等待用户输入吗?我有什么明显的遗漏吗?
我知道这是旧的,但对于像我这样在谷歌搜索时遇到这个的人来说。这就是你这样做的方式......它实际上很简单!
查看此链接 -->光标移动
基本上向上移动 N 行:
echo -e "\033[<N>A HELLO WORLD\n"
只需将“ < N > ”更改为您想要返回的行数......例如,向上移动 5 行将是“/033 [5A”
据我所知,除非你深入研究更底层的东西,比如全屏模拟器,比如 curses,否则这是不可能的。
这有点像在黑暗中刺伤,但您可以使用VT102 终端代码来控制光标,而无需使用 Curses。您感兴趣的相关 VT102 命令都包括发送 ESC,然后是 [,然后是特定的命令参数。
例如,要将光标向上移动一行,需要输出:
ESC [ 1 A
0x1B 0x5B 0x31 0x41
请注意,VT102 文档通常使用八进制,因此如果您使用十六进制,请随身携带一个ascii 表。
所有这些建议都是在未经测试的情况下给出的——我不知道是否可以将 VT102 命令嵌入到您的 bash 提示符中,但我认为这可能值得一试。
编辑:是的——看起来很多人在他们的 bash 提示中使用 VT102 格式化代码。要将上面的示例翻译成 Bash 可以识别的内容,请输入:
\e[1A
进入您的提示应该将光标向上移动一行。
这是很有可能的。如果您的 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
默认情况下也会接受该行。
添加换行符然后将光标移回常规提示符(如您所描述的)是可能的,但不会产生您想要的效果。您插入的换行符只会被应用程序输出覆盖,因为您将光标移回了它的前面。
这有效:
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
I believe (but haven't tried) if you put '\n\b'
in the prompt string it would do that.
一般来说,如果你想找出终端可以做的任何事情的代码,请阅读terminfo
手册页。
在这种情况下,光标向上一行代码可以通过以下方式确定:
tput cuu1
如果将 tput 输出重定向到文件,则可以查看使用了哪些控制字符。
Bash 还支持 PROMPT_COMMAND 变量,允许您在发出每个提示之前运行任意命令。