我想在我的bash提示符之后和Mac上的输出之前有一个空行。看起来应该是这样的:
echo; ls
我可以在bash提示符中添加换行符,然后返回一行以等待用户输入吗?有什么明显的东西我不见了吗?
答案 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变量,允许您在发出每个提示之前运行任意命令。