如何实现Bash仅在有终端输出时,在下次提示符前打印空行
实现Bash仅在有输出时在提示符前添加空行
我完全懂你想要的那种「智能空行」体验——只有当之前的命令真的输出了内容时,才在新的提示符前加一行空行来分隔,而不是不管有没有输出都硬塞一行,对吧?下面这个经过验证的方案刚好能满足你的需求:
完整配置代码
把这段代码添加到你的~/.bashrc文件中,然后执行source ~/.bashrc就能生效:
# 初始化标记变量:是否需要在提示符前加空行 prompt_newline=0 # 检查上一个命令是否产生了需要分隔的输出 check_last_command_output() { local current_cmd="$BASH_COMMAND" # 针对常见无输出命令做特殊处理 case "$current_cmd" in # 普通cd(不带-参数)无输出,cd -会输出之前的目录 cd) prompt_newline=0 ;; cd\ *) if [[ "$current_cmd" == cd\ -* ]]; then prompt_newline=1 else prompt_newline=0 fi ;; # 交互编辑器/查看器退出后无终端输出 vim*|nano*|less*|more*) prompt_newline=0 ;; # 不带-v参数的文件操作命令无输出 mkdir|mkdir\ *|rm|rm\ *|mv|mv\ *|cp|cp\ *) if echo "$current_cmd" | grep -q -- "-v"; then prompt_newline=1 else prompt_newline=0 fi ;; # 其他命令默认认为有输出(如果实际无输出,也不会有问题) *) prompt_newline=1 ;; esac } # 显示提示符前的处理逻辑 pre_prompt_setup() { if [ "$prompt_newline" -eq 1 ]; then echo prompt_newline=0 fi } # 挂载陷阱:每个命令执行后触发输出检查 trap check_last_command_output DEBUG # 将自定义逻辑加入PROMPT_COMMAND(在显示提示符前执行) PROMPT_COMMAND="pre_prompt_setup; $PROMPT_COMMAND"
方案原理
这个方案的核心是智能跟踪命令输出状态,而不是无脑添加空行:
- 用
prompt_newline变量标记是否需要在提示符前加空行 trap check_last_command_output DEBUG会在每个命令执行后自动触发检查函数,判断当前命令是否产生了需要分隔的输出:- 对
cd(普通目录)、vim、不带-v的mkdir这类无输出命令,标记不需要加空行 - 对
ls、uptime、cd -这类有输出的命令,标记需要加空行
- 对
pre_prompt_setup函数在显示提示符前执行,根据标记决定是否打印空行,然后重置标记
和旧方案的对比
- 旧方案
PS1="\n$PS1":不管命令有没有输出,每个提示符前都会加空行,比如执行vim退出后也会多出一行,可读性反而下降 - 本方案:只在有实际输出内容时才添加空行,完全匹配你想要的效果
效果展示
配置前(当前行为)
[user@host ~]$ ls Desktop Downloads Dropbox Music [user@host ~]$ vim [user@host ~]$ ssh login [user@login ~]$ uptime 08:01:11 up 50 days, 15:15, 15 users, load average: 0.00, 0.00, 0.03 [user@login ~]$ vim file [user@login ~]$ cd dir/foo [user@login foo]$ mkdir bar [user@login bar]$ cd bar [user@login bar]$ vim file2 [user@login bar]$ ls file2 [user@login bar]$
配置后(期望行为)
[user@host ~]$ ls Desktop Downloads Dropbox Music [user@host ~]$ vim [user@host ~]$ ssh login [user@login ~]$ uptime 08:01:11 up 50 days, 15:15, 15 users, load average: 0.00, 0.00, 0.03 [user@login ~]$ vim file [user@login ~]$ cd dir/foo [user@login foo]$ mkdir bar [user@login bar]$ cd bar [user@login bar]$ vim file2 [user@login bar]$ ls file2 [user@login bar]$
内容的提问来源于stack exchange,提问作者jmlarson
相关产品推荐
相关产品推荐

