在bash提示符中向后退

时间:2008-11-10 16:39:45

标签: bash prompt

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

echo; ls

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

7 个答案:

答案 0 :(得分:8)

我知道这已经过时了,但对于像我这样的人在谷歌上搜索它时。这是你怎么做的...... 它实际上非常简单!

查看此链接 - > Cursor Movement

基本上向上移动N行:

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

只需将“&lt; N&gt; ”更改为您想要返回的许多行... 例如,要向上移动5行,它将是“/ 033 [5A”

答案 1 :(得分:4)

据我所知,这是不可能的,除非你深入研究像诅咒这样的全屏模拟器等更低级的东西。

答案 2 :(得分:3)

这在黑暗中有点刺,但你可以能够使用VT102 terminal codes来控制光标而不必使用Curses。您感兴趣的相关VT102命令包括发送ESC,然后是[,然后是特定的命令参数。

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

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

请注意,VT102文档通常使用八进制文件,因此如果您使用的是十六进制文件,请保留ascii table

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

编辑:是的 - 看起来像a lot of people在他们的bash提示中使用VT102格式代码。将上面的例子翻译成Bash会认识到的东西:

\e[1A

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

答案 3 :(得分:2)

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

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

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

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

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

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

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

答案 4 :(得分: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的内容,因此该标志设置为true - 为下一个周期做好准备。

因为在空命令行上按Enter仍然会触发$PROMPT_COMMAND内容的执行,所以陷阱中的测试也会将这些内容检查为当前命令,如果没有执行echo,则执行{{1}}他们匹配。

答案 5 :(得分:1)

我相信(但还没有尝试过)如果你将'\n\b'放在提示字符串中就可以了。

答案 6 :(得分:0)

一般情况下,如果您想查找终端可以执行的任何操作的代码,请阅读terminfo手册页。

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

tput cuu1

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

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