awk:运行时错误 - MacOS Catalina 上的 zsh 配置与 Debian Buster 上的 zsh 配置之间的兼容性

awk: runtime error - Compatility between zsh config on MacOS Catalina and zsh config on Debian Buster

我在 MacOS Catalina 上有一个运行良好的 zsh 配置。不,除了 Debian 10 Buster,我也想得到相同的东西。

使用 PROMPT 函数时出现问题,该函数显示粉红色斜杠,用于分隔当前工作的 PATH,其中目录为蓝色。

在 MacOS 上,我这样做(进入我的 .zshrc):

# Path with colorized forward slash
slash_color() {
dirs | awk -F "/" '{ blue="%{3[38;5;75m%}"; \
                     pink="%{3[38;5;206m%}"; \
                     for (i=1; i<NF; i++) \
                      printf blue $i pink "/"; \
                     printf blue $NF pink; \
                   }';
}

# Prompt final
PROMPT=$'%F{13}|%F{green}%n@%F{cyan}%m%F{13}|%f%T%F{13}|$(slash_color)%F{13}|%F{7} '

PROMPT 的结果如下:

现在,在 Debian Buster 上,我从 MacOS Catalina 复制了 ~/.zshrc。

当显示 PROMPT 时,不显示当前工作目录的 PATH(空) 并且出现以下错误:

awk: run time error: not enough arguments passed to printf("%{%}~%{%}/")
    FILENAME="-" FNR=1 NR=1

我不知道为什么我在 Debian 上有这个错误,而在 MacOS 上没有。我怀疑这是由于我的 slash_color() 函数的工作方式不同,但我不明白其来源。

似乎 awk 的 Debian 版本中缺少一个变量,但我看不到哪个变量。

不要做:printf something。永远做 printf "%s", something。 awk 错误,因为您传递了无效的 printf 格式说明符 %{%},但您没有传递任何参数。做:

printf "%s%s%s/", blue, $i, pink;

我想你可以:

{gsub("/", pink "/" blue)}1

我会使用预命令挂钩和简单的参数扩展,而不是派生各种外部程序。

precmd () {
    bar='%F{13}|'
    prompt="$bar%F{green}%n@%F{cyan}%m$bar%f%T$bar%F{75}"
    prompt+=${PWD:gs./.%F{206}/%F{75}}
    prompt+="$bar%F{7} "
}

将此添加到您的 .zshrc 文件中,prompt 将在显示之前重置,而不是在提示本身中嵌入 shell 函数。

PWD 是当前工作目录。 gs.---.--- 扩展修饰符将每个 / 替换为 %F{206}/%F{75},使用 zsh 自己的颜色转义序列而不是使用原始 ANSI 转义序列。