在上一个命令失败后创建带有红色 $ 的 Bash 命令提示符

2023-11-29

我是 Bash 编程新手,我正在努力创建一个自定义 Bash 命令提示符。我的目标是创建一个提示,仅在登录名和主机名与我通常使用的不同时显示它们。当位于 Git 版本控制下的目录中时,我还希望将当前的 Git 分支附加到命令提示符。

我想将登录名和主机名部分设置为绿色,目录路径设置为蓝色,Git 分支部分设置为粉色,分隔符(: 和 $ 字符)设置为白色。然而,当先前执行的命令返回零以外的任何值时,我想将 $ 分隔符设置为红色。没有颜色的一般格式如下所示:

loginname@hostname:~/current/path:branchname$

唯一必需的部分是目录路径和 $ 字符。这是我为我编写的代码.bashrc file:

MYNAME="gwen"
MYHOST="gwen-laptop"

RED="\[\033[31m\]"
WHITE="\[\033[0m\]"
GREEN="\[\033[01;32m\]"
BLUE="\[\033[01;34m\]"
PINK="\[\033[01;35m\]"

DOLLAR="if [ \$? = 0 ]; then echo ${WHITE}\$; else echo ${RED}\$${NORMAL}; fi"
GITBRN='$(__git_ps1 "\033[0m:\033[01;35m%s")'

USERNM="if [ \u != ${MYNAME} ]; then whoami; fi;"
HOSTNM="if [ \h != ${MYHOST} ]; then echo -n @; hostname; fi;"
COLONM="if [ \u != ${MYNAME} ] || [ \h != ${MYHOST} ]; then echo -n :; fi;"

PS1="${GREEN}\`${USERNM}\`\`${HOSTNM}\`${WHITE}\`${COLONM}\`${BLUE}\w${GITBRN}\`${DOLLAR}\` "

这段代码满足了我的所有要求,除了它始终将 $ 字符保留为白色,并且不会在适当的时间将其着色为红色。 (我怀疑问题是DOLLAR中的“\$?”引用了之前执行的命令,但是DOLLAR是在构建PS1时最后执行的,所以之前的执行语句不再是PS1构建开始之前运行的命令;这是一些东西这是为了创建命令提示符而执行的。)我是不知道如何解决这个问题.

这段代码很丑陋并且需要重构。我试图将所有颜色代码移到它们自己的变量中,但是当我在 GITBRN 代码中使用这些颜色变量时,事情变得混乱,所以我最终在那里使用了文字颜色。

我花了一整天的时间试图让这段代码正常工作,但我想此时我无处可去。任何关于如何在适当的时间将美元符号变成红色的建议将非常感激。我也愿意接受有关重构代码以使其更清晰、更具可读性的建议。

附:我是 Ubuntu Linux (Lucid Lynx) 用户。


Use the PROMPT_COMMAND变量,根据 bash 手册页,该变量在每个主提示符之前执行。

例如(这还行不通,我正在努力让它正常工作,但我认为这是可能的):

PROMPT_COMMAND="if [ \$? = 0 ]; then DOLLAR="${WHITE}\$${NORMAL}"; else DOLLAR="${RED}\$${NORMAL}"; fi"

Edit:由于执行命令和内部非打印字符时遇到挫折PS1 (the \[ and \]有时会按字面意思打印出来,而不是用作提示PS1),我想出了这个(替换...提示中包含您想要的任何内容):

PROMPT_COMMAND='if [ $? = 0 ]; then DOLLAR_COLOR="\033[0m"; else DOLLAR_COLOR="\033[31m"; fi'
PS1='...\[$(echo -ne $DOLLAR_COLOR)\]$\[\033[m\] '

当然,使用$()你可以把你喜欢的任何部分放进去PS1而不是使用PROMPT_COMMAND,我只是喜欢这样,所以PROMPT_COMMAND包含逻辑和PS1包含显示命令。

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

在上一个命令失败后创建带有红色 $ 的 Bash 命令提示符 的相关文章

  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • 在 Linux 中重新启动时,新创建的文件变为 0 kb(数据被覆盖为空)

    我遇到了一个奇怪的问题 这让我发疯 当前的任务是在 root 用户第一次登录时启动一组文件 并在同一用户第二次登录时启动另一组文件 我决定使用 profile 和 bashrc 文件 并在第一次登录期间发生的任务结束时重新加载 bashrc
  • 如何使用 Bash 编写二进制文件?

    我的问题是我需要创建一个包含以下确切字节的文件 48 00 49 00 我不能使用C perl 其他脚本语言 目标是嵌入式设备 我使用 awk 尝试过 在桌面上它确实有效 awk BEGIN printf c c c c 48 00 49
  • 使用 sed 查找并替换包含非转义字符的变量

    我可以使用它来查找 fly 的所有实例 并将其替换为文件中的 insect sed i s fly insect g animals txt 如何找到 BASH 变量并将其替换为另一个 BASH 变量 例如 name echo fly ca
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • VBA Shell 并等待退出代码

    我正在打包一个办公应用程序 VBA 它调用 C 控制台应用程序来执行应用程序 大型模拟程序 的一些繁重工作 我希望能够让 VBA 应用程序等待控制台应用程序完成并从控制台应用程序检索退出代码 我已经能够做到前者 但尚未能够从应用程序中检索退
  • 当我尝试在 .bashrc 中添加命令时出现命令未找到消息

    我问了一个问题如何在 bash shell 中编写漂亮优雅的 linux 命令 https stackoverflow com q 19720095 80353 当我尝试该建议时 我收到以下错误消息 Sorry command not fo
  • 在 Bash Linux 中,如果给定进程运行时间超过指定时间,如何获取通知?

    我一切顺利 我的程序在大约 N 秒内完成 maybe deadlock 但有时会随机发生死锁 导致程序永远挂起 为了调试这个 我想按照以下方式运行该程序 如何调试罕见的死锁 https stackoverflow com questions
  • 如何使用命令行压缩文件?

    我想使用批处理文件命令 Windows XP 批处理文件 压缩目录 例如 如果我想解压缩一个文件意味着我可以使用jar xf file zip java bat 文件命令 就像我想要一个命令行批处理来压缩目录一样 如果您使用的是 Ubunt
  • Bash - 将键绑定到字符串(不是函数)

    如何获得键绑定以导致在命令行插入任意文本 在 zsh 中我这样做 bindkey s m myspecialscript 在 bash 中 有等效的吗 没有一个内置函数可以实现我想要的功能 bind e E home yourscript
  • 如何制作 Bash 脚本来查找项目中未使用的图像?

    如何制作一个 Bash shell 脚本 它可以识别所有 jpg gif 和 png 文件 然后识别文件夹中任何文本文件中哪些文件未通过 url href 或 src 链接 这就是我开始的 但我最终得到了与我想要的相反的结果 我不想知道引用
  • 使用 SIGINT 默认处理程序时从 system() 返回值

    我遇到了一些奇怪的返回值system 当子进程从终端接收到 SIGINT 时 解释一下 从 Perl 脚本parent pl I used system 运行另一个 Perl 脚本作为子进程 但我还需要通过 shell 运行子进程 所以我使
  • 静默检查 bash 脚本中是否存在 rpm

    我正在尝试使用 if 语句快速检查 rpm 是否安装在 bash 脚本中 但我想默默地做 目前 当我运行脚本并且 rpm 确实存在时 它将 rpm 的输出输出到我不想要的屏幕 if rpm qa grep glib then do some
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下

随机推荐

  • “Set-AzureRmDataFactoryV2”未被识别为 cmdlet 的名称

    我已经在 Ubuntu 16 04 上安装了 Powershell 6 0 0 尝试使用 Powershell 创建 Azure 数据工厂时出现以下错误 Set AzureRmDataFactoryV2 The term Set Azure
  • 获取mp3文件长度

    我目前正在尝试用 C 编写一个音频播放器 我正在使用 BASS 库来处理播放音乐 但现在我在获取歌曲长度方面遇到了小问题 好吧 我读过 BASS 文档并找到了一种方法 我需要做的 所有 就是 int stream Bass BASS Str
  • 使用 Containable 对关联模型 (HABTM) 上的条件过滤的结果进行分页

    我需要对列表进行分页Products 属于特定Category HABTM 协会 In my Product我有的型号 var actsAs array Containable var hasAndBelongsToMany array C
  • 如何在cmake中链接所有LLVM库?

    我想链接我的 cmake C 项目中的所有 LLVM 库 I use llvm config components为了获得 LLVM 的所有组件 它给了我 llvm config components aarch64 aarch64asmp
  • 使用 Greasemonkey 将日期选择器添加到文本框

    有一个需要日期但没有日期选择器的文本框 我想用 Greasemonkey 添加一个 我寻找一个例子 但找不到 这可能吗 有这样做的例子吗 它不需要很花哨 我喜欢用jQuery UI 的 datepicker 因为我通常都会加载 jQuery
  • 为什么 git 会在每个命令名称前添加“git-”?

    如果我需要帮助git status命令 我可以输入git help status 并返回一个帮助页面 显示名称为 git status But git status 不是命令 命令是git status有一个空格 而不是连字符 如果我输入g
  • 来自 Qt 中 main.cpp 代码的 MainWindow

    想要了解之间的代码差异MainWindow和main cpp 具体来说 如何专门编写一段代码main cpp需要修改为的一部分mainwindow cpp and mainwindow h 作为一个例子 我试图修改这个罚款的代码answer
  • 函数返回后不更改指针

    语言是 Go Golang 功能initApp正在接收一个指向对象的指针 Go 中的 struct 在函数内部 我创建一个新的对象指针并初始化该对象的值 打印和调试器都显示在函数返回之前一切都很好 但在返回之后 作为函数参数的指针具有与函数
  • 如何从命令行重建并运行 android 项目

    我想创建与 android studio 通过命令行在后台运行的相同进程 like first clean project gt build project gt Run Project all through command line 可
  • PLC 中的定时器 - 结构化文本

    PLC 结构化文本 ST 中的计时器如何工作 我们如何声明它们 我一直在研究PLC的标准 IEC 61131 3 他们没有谈到ST中的定时器 我知道绝大多数 PLC 程序员都是用梯形图逻辑来完成这些任务 但在这种特殊情况下 我确实需要在 S
  • ActionBar 选项卡标题中的自定义字体

    我正在尝试在我的上设置自定义字体ActionBar选项卡的标题 我看到更多的开发人员要求以正确的方式在 SO 上执行此操作 例如如何自定义操作栏选项卡的字体 如何 如果可能 在选项卡文本的 ActionBar 中使用资产文件夹中的字体设置自
  • ValueError:应在输入列表上调用合并层。张量流 Keras

    我目前正在尝试使用 MobileNetV2 的前 50 层 因此 我想提取这些层并创建一个新模型 我以为我可以调用每一层 但是 block 2 add 层会导致错误 我不明白为什么 import tensorflow as tf from
  • 使用服务器进行表单验证

    我有一个表单 我想通过检查电子邮件是否存在来执行 http 验证 但它返回错误 这是我的表格 在表单组件上 constructor private formBuilder FormBuilder private validationServ
  • 如何隐藏jSlider的旋钮?

    我需要自定义JSlider的旋钮 我需要将我自己的旋钮图像放在 Jslider 的默认旋钮上 问题是目前有两个旋钮做出响应 一个是我自己的旋钮 第二个是默认旋钮 请告诉我如何隐藏默认旋钮或任何其他解决方案 下面的代码用于执行此操作 publ
  • 反向地理编码在某些 Android 设备上不起作用?

    我正在开发一个地图应用程序 无法在该手机中获取地址 其android版本是4 3 如下所示 但它在我的手机上运行良好 其版本是4 1 2 如下所示 它在某些棒棒糖版本中运行良好 final Geocoder gc new Geocoder
  • K8s:如何通过服务访问我的应用程序?

    我正在学习 K8s 并在 OSX 上安装了 minikube 我正在阅读 Nigel Poulton 的 K8s 书 并在第 5 章 部署 中进行实验 我有这样的部署 k8s cat deploy yaml apiVersion apps
  • 将 Azure 流量管理器与移动应用程序结合使用

    Azure 流量管理器可以与移动应用程序一起使用 特别是通过社交登录吗 我已经配置了一个流量管理器和两个应用程序服务 例如 mobileapp1 和 mobileapp2 来使用它 它们似乎与邮递员和响应配合得很好 一切都正常 现在 我已在
  • 如何在Linux中使用addr2line命令?

    我试图在 Unix 中使用 addr2line 命令 但每次它都会给出与 0 相同的输出 我发出命令为addr2line e a out 0x4005BDC 我在运行这个 a out 可执行文件时得到了这个地址valgrind查找内存泄漏的
  • MathJax 未在 Sphinx 中呈现

    我在 Sphinx Rest 中有一个文档集 我已将 sphinx ext mathjax 包含在 conf py 中 并包含行 mathjax path http cdn mathjax org mathjax latest MathJa
  • 在上一个命令失败后创建带有红色 $ 的 Bash 命令提示符

    我是 Bash 编程新手 我正在努力创建一个自定义 Bash 命令提示符 我的目标是创建一个提示 仅在登录名和主机名与我通常使用的不同时显示它们 当位于 Git 版本控制下的目录中时 我还希望将当前的 Git 分支附加到命令提示符 我想将登