自定义 Bash 提示符正在覆盖自身

2023-12-12

我正在使用自定义 bash 提示符来显示 git 分支。

一切都在/etc/bash/bashrc:

function formattedGitBranch {
    _branch="$(git branch 2>/dev/null | sed -e "/^\s/d" -e "s/^\*\s//")"
    # tried these:
    echo -e "\e[0;91m ($_branch)"                       
    echo -e "\e[0;91m ($_branch) \e[m"                  
    echo -e $'\e[0;91m'"($_branch)"
    echo "($_branch)"                                   
    echo "$(tput setaf 2) ($_branch) $(tput setaf 9)"
    printf "\e[0;91m ($_branch)"
}

# color is set before function call
PS1='\[\033[01;34m\] \[\033[0;91m\]$(formattedGitBranch) \$\[\033[00m\] '
# color is set inside function
PS1='\[\033[01;34m\] $(formattedGitBranch) \$\[\033[00m\] '

问题是当我设置颜色时$_branch在函数中,当达到 EOL 时,我的提示将被覆盖:

mmmmmmmmmmmmp/rainyday.js (master) $ mmmmmmmm

尝试了所有可能的变体tput, printf, $''符号。

我通过仅设置颜色解决了这个问题PS1:

ad@gentoo /tmp/rainyday.js (master) $ mmmmmmm

But..

  1. 我想知道为什么它会覆盖我的提示
  2. 使用函数时如何解决这个问题

我正在使用 Gentoo Linux。GNU bash, verze 4.2.37(1)-release (i686-pc-linux-gnu)


1)我想知道为什么它会覆盖我的提示

因为每个不可打印的字符都必须通过转义\[ and \]否则readline无法正确跟踪光标位置。

你必须把\[ and \]提示中任何非打印转义序列周围。
如果没有\[ \]bash 会认为构成颜色代码转义序列的字节实际上会占用屏幕上的空间,因此 bash 将无法知道光标实际在哪里。

\[开始一系列非打印字符。 (如颜色转义序列)。这 允许 bash 正确计算自动换行。

\]结束非打印字符序列。 --BashFAQ

...注意非打印字符的转义,这些确保 readline 可以正确跟踪光标位置。 --ss64.com

2)如何解决这个问题function is used

如果你想在 a 中设置颜色function其输出用于PS你有两个选择。

  • 要么转义整个函数调用:

    PS1='\[ $(formattedGitBranch) \] '

  • Or 替换非打印Escape里面的序列echo。即替换:

    \[ and \] with \001 \002

    (谢谢用户引力!)

  • echo -e 不知道bash 的\[ \]所以你必须用这些替换\001 & \002用于分隔不可打印字符和可打印字符的 ASCII 控制代码:

    function formattedGitBranch { echo -e "\001\e[0;91m\002 ($_branch)"; } PS1='$(formattedGitBranch) '

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Bash 提示符正在覆盖自身 的相关文章

  • 如何替换每行中出现的所有字符串?

    我想在以下脚本中将所有出现的 用户名 替换为 但它仅替换第一次出现的情况 ls al sed s username 这就是 sed 默认情况下的工作方式吗 提前致谢 你需要g 全局 修饰符 sed s username g
  • Bash:查找并连接文件

    我有以下结构 home DIR1 file ab csv DIR2 file cd csv DIR3 file3 ef csv Where file csv包含多行浮点数 每个 DIR 都有不同的浮点数 我想抓取所有的内容file csv文
  • envsubst 不能进行就地替换吗?

    我有一个配置文件 其中包含一些 ENV VARIABLE 样式的变量 This is my file It might contain EXAMPLES of text 现在我希望将该变量替换为保存在实际环境变量中的值 所以我正在尝试这个
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • Bash 中的 Shellshock 漏洞背后的行为是有记录的还是有意为之?

    最近的一个漏洞 CVE 2014 6271 http web nvd nist gov view vuln detail vulnId CVE 2014 6271 如何Bash http en wikipedia org wiki Bash
  • 参考当前命令的先前参数

    例如 我想执行以下操作 mv xxxx xxxx bak 我知道我可以使用这个命令 mv xxxx bak 我认为这在某种程度上并不直接 如果我能做到这一点那就太好了 mv xxxx 1 bak 有时我需要这样 echo xxxx yyyy
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • 从 bash 脚本运行节点

    很简单 我正在尝试使用 cron 自动运行 nodejs 脚本 但是脚本本身似乎无法运行该文件 我的脚本很简单 usr bin env node node var node assets js update js 但是 在运行此命令时 它返
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • 如何在 bash 中结合超时和 eval 命令

    为了执行存储在变量中的命令eval使用命令 gt a echo e a nb wc l gt eval a 2 但如何才能与它结合起来呢 timeout命令 我尝试过以下操作 这给了我错误的输出 gt timeout 10 a a b wc
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 如何将命令作为参数传递给 ssh [重复]

    这个问题在这里已经有答案了 我的需要是让这个命令起作用 sshpass p XXXX ssh oStrictHostKeyChecking no email protected cdn cgi l email protection sudo
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 规范化 solaris 上的路径名

    在 GNU 系统上我只会使用readlink f SOME PATH 但 Solaris 没有 readlink 我更喜欢在 bash 中运行良好的程序 但如果需要的话其他程序也可以 Edit 到目前为止 我想到的最好的方法是使用 cd 和
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 文本处理问题:删除其中一列不包含特定值的行

    我有一个制表符分隔的文件 如下所示 input sequence match sequence score receptor group epitope antigen organism ASRPPGGVNEQF ASRPPGGVNEQF

随机推荐

  • 如何在我的项目中使用 Chrome 调试 Angular *ngIf 结构指令?

    我想将 Angular 源代码 源映射附加到我生成的 Angular CLI 项目中 以便我可以调试如下指令 ngIf在 Chrome 中 是否可以以某种方式将调试器附加到ng if ts使用一些 angular json 配置 源映射 或
  • 使用 fsolve 的方程组

    我尝试使用以下方法找到方程组的解scipy optimize fsolve在Python 2 7中 目标是计算化学系统的平衡浓度 由于问题的性质 一些常数非常小 现在对于某些组合我确实得到了正确的解决方案 对于某些参数我找不到解决方案 要么
  • 如何防止Python IDLE在运行新脚本时重新启动

    我使用Python 3 6 1 IDLE 我希望能够运行一系列脚本 同时维护本地环境 变量等 就像我已将所有命令逐行输入到 shell 中一样 但是 每当我执行脚本时 环境都会重新启动 并且我会丢失之前执行的所有变量 我可以采取什么措施来防
  • Pandas 数据框中值的矢量化查找

    我有两个 pandas 数据框 其中一个称为orders另一个叫daily prices daily prices如下 AAPL GOOG IBM XOM 2011 01 10 339 44 614 21 142 78 71 57 2011
  • java.util.Scanner 跳过输入请求[重复]

    这个问题在这里已经有答案了 我正在尝试使用接收输入java util Scanner Scanner scanner new Scanner System in int bla scanner nextInt String blubb sc
  • 是否有使用 ExoPlayer 实现 DASH 的非 YouTube 示例?

    您好 我正在寻找配置示例ExoPlayer for DASH 但我发现的例子使用 Youtube 视频 有没有 YouTube 上没有的视频示例 能DASH可以针对互联网上的任何视频进行配置吗 是的 ExoPlayer 可以通过 HTTP
  • 如何将Yii2的ActiveForm复选框设置为选中状态?

    我正在为 Yii2 ActiveForm 复选框控件的 选中 状态寻找一个简单的解决方案 但我找不到如何设置它的解决方案 我在文档中找不到任何示例 我尝试过操纵渲染代码 但看来我需要修改 ActiveForm 本身 如何让复选框默认选中 好
  • 如何停止oracle撤消进程?

    我想知道如何停止oracle的撤消过程 我试图删除一个大表的数百万行 在过程中我终止了会话 但它开始撤消删除 并且在大约两个小时内数据库变得非常慢 我不想继续撤消过程 有什么办法可以阻止它吗 您无法停止回滚事务的过程 因为这样做会使数据库处
  • 当微调器遮盖锚元素时,如何使用 Selenium 和 Python 单击锚元素?

    我是硒的新手 我已经尝试单击锚元素有一段时间了 我已经尝试过 css selector lint text xpath absolute xpath 但我仍然无法单击它 而是收到此错误消息 selenium common exception
  • Dropbox API 请求令牌不适用于 Python 3?

    我正在使用官方 Dropbox API 维护一个 Python 应用程序 为了要求用户让我的应用程序使用他们的 Dropbox 帐户 我使用了一个使用 DropboxSession 类的小脚本 这显然与我们可以在这篇博文 Include t
  • git merge 覆盖内容

    这是我的情况 我有两个功能分支 A 和 B 我想合并这两个分支 我做了以下事情 创建一个从 A 分支出来的新分支 C 签出新分支C run git merge B从命令行 我希望这两个分支合并 如果对相同文件的更改存在冲突 则该命令应引发合
  • Mongoose删除文档中的数组元素并保存

    我的模型文档中有一个数组 我想根据我提供的密钥删除该数组中的元素 然后更新 MongoDB 这可能吗 这是我的尝试 var mongoose require mongoose Schema mongoose Schema var favor
  • 如何确保链接的默认操作始终处于禁用状态?

    我正在开发一个项目 其中使用大量 ajax 调用来使站点交互更加优雅 我一直在使用的过程是获得脚本的链接 该脚本执行作为链接标记中的 href 存储的适当操作 然后 我使用 jquery 定位该元素并禁用默认操作并执行 ajax 调用 问题
  • Eclipse 中 Scanf 在 printf 之前执行

    我有以下简单的C语言代码 include
  • 在promise then mehod中返回Promise对象时的执行顺序[重复]

    这个问题在这里已经有答案了 代码是 Promise resolve then gt console log 0 return Promise resolve 4 then res gt console log res Promise res
  • 循环组合框 VBA

    我陷入了无法找到正确语法的困境 我正在处理的代码如下所示 Public Function Initializecolors initialize the colors by setting them with the help of the
  • 如何强制将重置推送到远程存储库?

    我们的远程主分支不知何故搞砸了 当前的开发代码与最新的提交一起位于主分支上 显然 开发代码还没有准备好用于主分支 因此 在我的本地存储库中 我重置了最新标签 git reset hard Tag 主分支现在在我的本地存储库上是正确的 现在
  • 以另一种形式访问类的同一实例

    我确信这是一个简单的问题 但我没有足够的经验来知道答案 DataClass Form1 Form2 我有公开课DataClass 在一个单独的文件中 DataClass vb In DataClass我需要访问的数据存储在多个数组中 我有方
  • 在 matplotlib 中绘制大量点和边

    我有一些这种格式的点 大约 3000 和边 大约 6000 points numpy array 1 2 4 5 2 7 3 9 9 2 edges numpy array 0 1 3 4 3 2 2 4 其中边是点的索引 因此每条边的开始
  • 自定义 Bash 提示符正在覆盖自身

    我正在使用自定义 bash 提示符来显示 git 分支 一切都在 etc bash bashrc function formattedGitBranch branch git branch 2 gt dev null sed e s d e