当前位置: 首页 > 知识库问答 >
问题:

命令替换内的 Zsh 颜色

吴星汉
2023-03-14

在 zsh 中为命令的着色输出有点简单。请考虑 zsh 提示符中的以下示例:

打印-P“%F{青色}$(日期“%H:%M:%S”)$重置”

你会得到预期的青色HH: MM: SS。它也能按预期在提示符下工作。现在假设我想用不同的颜色给分钟和秒上色。我没有设法使用%F{color}实现它,可以吗?

我可以使用ANSI代码使其工作,但即使这样,它也可以用于打印,在~/.zshrc:

< code > print-P " % F { cyan } $(date ' % H:\ e[38;5;82m%M:%S')" -在zsh中工作

< code > RP S1 = " % F { cyan } $(date ' % H:\ e[38;5;82m%M:%S')"作为右提示符给出< code > 17:\ e[38;5;82m14:11

我错过了什么?如何转义颜色代码或更好地使用zsh<code>%F{color}</code>构造?

共有3个答案

巫晋鹏
2023-03-14

无需使用外部命令<code>date</code>:Zsh内置了用于显示日期和时间的提示转义:

[…]

%D{string}

字符串是使用strftime函数格式化的。有关更多详细信息,请参阅手册页strftime(3)。

[…]

所以简单的着色可以用

RPS1='%F{cyan}%D{%H:%M:%S}%f'

为了有两种颜色,您可以只使用两个< code>%D{…}块并给它们涂上不同的颜色

RPS1="%F{cyan}%D{%H}:%F{82}%D{%M:%S}"

这可以根据需要(想要)尽可能复杂:

RPS1='%F{154}%D{%H}%F{155}:%F{156}%D{%M}%F{157}:%F{158}%D{%S}'
年烈
2023-03-14

版本1-只调用date一次:

d=$(date +'%H:%M:%S');h=${d:0:2};ms=${d:3:5};
RPS1="%F{cyan}$h:%F{green}$ms%F{default}"

版本2 -调用< code>date两次:

RPS1="%F{cyan}$(date +'%H'):%F{green}$(date +'%M:%S')%F{default}"
冯玮
2023-03-14

它会有一些引用问题。

它不能使用双quoets<代码> $(日期...)部分将被扩展,< code>RPS1不会针对每个提示进行更新。< br >它可能无法避免任何转义(< code>\e)s .(尤其是< code > \ e[38;5;< code>date命令的82m部分)

因此,对于PS类字符串,使用$'…'如下形式引用会很有用:

setopt promptsubst
RPS1=$'%F{cyan}$(date +"%H:%%{\e[38;5;82m%%}%M:%S")%{\e[0m%}'

如果能找到< code > \ e[38;5;82m:

RPS1=$'%F{cyan}$(date +"%H:%%{%%F{82}%%}%M:%S")%{\e[0m%}'

它可以通过一些工具找到,比如https://en.wikipedia.org/wiki/ANSI_escape_code#Colors

注意:\e[38;5;82m %{…%}包围。

<代码> %{...%}
包含一个字符串作为文字转义序列。大括号内的字符串不应改变光标位置。大括号对可以嵌套。

- zshmisc(1),视觉效果,即时扩展

注2:setopt提示替换。如果没有此选项,打印 -P ...RPS1=... 将不起作用。

PROMPT_SUBST

如果设置,参数扩展、命令替换和算术扩展将在提示中执行。提示中的替换不会影响命令状态。

--- zshoptions(1), PROMPT_SUBST, zsh 选项

setopt promptsubst
print -P $'%F{cyan}$(date +"%H:%%{\e[38;5;82m%%}%M:%S")%{\e[0m%}'
;# => 23:54:18

PS:%F{color} 构造在屏幕上转储变量后,复制粘贴变量会更容易。

> print $RPS1 ;# this output could not been used for copy-pasting
%F{cyan}$(date +"%H:%%{%%}%M:%S")%{%}
> print $RPS1 | cat -v ;# this either (but close to)
%F{cyan}$(date +"%H:%%{^[[38;5;82m%%}%M:%S")%{^[[0m%}
 类似资料:
  • 命令替换将会重新分配一个命令使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括起来)将会产生命令行文本. 1 script_name=`basename $0` 2 echo "The name of this script is $script_name." 这样的话, 命令的输出可以被当成传递到另一个命令的参数, 或者保存到变量中, 甚至可以用

  • 行动时刻 - 使用命令替换 到目前为止,我们使用双引号来包含将被引用的变量。 Unlang还具有反引号字符串,允许命令替换。这些反引号内的字符串的计算方式类似于可以进行字符串扩展的双引号字符串。 让我们修改上一个练习,以显示操作中的命令替换: 1.编辑FreeRADIUS配置目录下的sites-available / default虚拟服务器,并在该部分顶部的post-auth部分中添加以下内容:

  • 问题内容: 如果给定其他配置文件,则rebar不会自动重建文件。因此,我尝试在Makefile级别上执行此操作: 希望的意图很明显:当我使用需要特定配置文件的目标时,请检查上次是否使用了相同的文件;运行并记录我们现在使用的配置。 但这不起作用,并且文件会不断重新编译: 尽管config.tmp包含“ normal”: 我想念什么? 问题答案: 在定义变量时,您缺少用于实际调用外部程序的部分。

  • 我刚刚安装了节点和纱线使用以下命令: 但是,如果我写在终端是说"zsh:命令未找到: npm" 在我的:我有: 我尝试使用以下指南卸载并重新安装Node和Thread:如何完全卸载Node。js,并从头重新安装(Mac OS X) 但我还是犯了同样的错误。

  • 问题内容: 我正在尝试使用命令行perl替换多行文件中的文本。我正在使用Ubuntu Natty。 以下是我的文本文件(称为test.txt)的内容: 以下是我的perl命令: 但是,下面是我最终得到的结果,而不是替换文件中的所有文本: 我在RegexBuddy中为Perl尝试了Regex,它与文本文件中的所有内容都匹配,但是由于某些原因,在命令行上使用perl不能正常工作。 我将不胜感激。 提前

  • 在上一节的基础上,我们给脚本加上更新时间及更新人信息: #!/bin/bash # sysinfo_page - A script to produce an HTML file title="System Information for" cat <<- _EOF_ <html> <head> <title> $title $HOSTNAME