假设您想在以下位置运行此命令bash
:
echo -n "Command of a specific length will break at the second run attempt."
这是 24x80 TTY 的输出:
ubuntu@ubuntu:~$ echo -n "Command of a specific length will break at the second
run attempt."
Command of a specific lenght will break at the second run attempt.ubuntu@ubuntu:
~$
假设您想再次运行相同的命令。
一旦你点击↑:
ubuntu@ubuntu:~$ echo -n "Command of a specific lenght will break at the second
run attempt."
Command of a specific lenght will break at the second run attempt.ubuntu@ubuntu:
run attempt."ommand of a specific lenght will break at the second r
这种情况发生在特定大小的命令中,这些命令最后不打印换行符。
这非常烦人。到目前为止,我还没有找到解决这个问题的方法,我认为遇到这个问题的每个人都会非常感谢能解决这个问题的人。
使用更智能的外壳,例如
zsh
:请注意它是如何添加一个
%
以指示缺少换行符并在不同的行上打印提示的。就打CtrlL。这将重绘您的终端并使所有内容按应有的方式显示:
这也可以完成
bash
。诀窍是使用一个自定义PROMPT_COMMAND
查询终端的光标位置(根据这个问题)。这个解决方案可能可以扩展到其他 shell,但我只熟悉
bash
. (有关解决方案,请参阅@muru 的回答zsh
)。也许已经有一个选项bash
可以自动执行此操作。把这个放在你的
.bashrc
:最后一行预先调用
new.line.if.not.on.left
您的PROMPT_COMMAND
(因为您可能已经PROMPT_COMMAND
定义了)。bash 函数的
new.line.if.not.on.left
工作原理如下:echo -n -e "\033[6n"
是一个魔术,它向终端询问光标当前位置的行和列。终端通过发送带有答案的假键盘输入来“响应”。read -s -d \[ garbage
. 响应的第一部分是一些乱码,某种转义码。通过将其存储在garbage
.read -s -d R foo
. 将假键盘响应存储在 bash 变量foo
中。-s
需要停止再次将read
输入回显到屏幕。And-d R
是定界符 - 假输入以 结尾R
,而不是您可能期望的换行符。column="$(echo "$foo" | cut -d';' -f2)"
从响应中提取列号(即跳过行号)并将结果存储在column
test "$column" "!=" 1 && { tput smso; echo "%"; tput rmso; }
如果当前列号不是 1,则打印百分号(和换行符)。命令打开“tput
脱颖而出模式” - 这应该使%
脱颖而出更多 - 可能是粗体或可能通过反转背景和前景色。