ls: bash: printf: `Y': VS Code 中的无效格式字符,而不是终端中的无效格式字符

ls: bash: printf: `Y': VS Code 中的无效格式字符,而不是终端中的无效格式字符

我升级到 Linux Mint 21(基于 Ubuntu 22),遇到了一些小问题,其中之一是VS代码,不在终端(gnome-terminal)中运行ls别名

bash: printf: `Y': invalid format character

虽然我已经定义了这些别名:

# Base `ls` alias contains:
# - escape for it could be defined already
# - use colors when appropriate
# - group directories first
# - date format YYYY-Mmm-DD
alias ls="\ls --color=auto --group-directories-first --time-style=+'%Y-%b-%d'"

我没有注意到 Focal 中的这种行为,也许我现在只是寻找错误,或者这确实是一些错误(我的,无论是谁)?

笔记:

https://www.gnu.org/software/coreutils/manual/html_node/Date-conversion-specifiers.html


$ type -a ls
ls is aliased to `\ls --color=auto --group-directories-first --time-style=+'%Y-%b-%d''
ls is /usr/bin/ls
ls is /bin/ls

两个都在终端和 VS Code 中。

printf %q\\n "PS1=$PS1" "PS2=$PS2" "PS3=$PS3" "PS4=$PS4" "PROMPT_COMMAND=$PROMPT_COMMAND"
PS1=\\\[\\e\]0\;\ \\w\ \\a\\\]\\\[\$color_green\\\]\\\$\ \\\[\$color_reset\\\]
PS2=\>\ 
PS3=
PS4=+\ 
PROMPT_COMMAND=

仅在 VS Code 中(终端中没有任何内容):

trap -p DEBUG
trap -- '__vsc_preexec_only "$_"' DEBUG

从原始版本重新发布图像:

在此输入图像描述

答案1

Bash 可以在运行当前命令之前处理当前命令的文本,方法是启用DEBUG 陷阱。这最初是为了调试,但它通常用于在命令运行时将窗口标题设置为命令的文本。

extdebug bash选项调整陷阱的工作方式DEBUG。其影响之一是,如果陷阱代码DEBUG返回非零状态,则不会执行该命令。

您在 VSCode 中的配置DEBUG设置了陷阱(trap -p DEBUG如果设置,则显示代码)。这很可能是为了将窗口标题设置为正在运行的命令的文本。看来这段代码有一个错误,并尝试以某种printf格式传递命令。当命令包含反斜杠或百分号时,此情况会中断。因为该extdebug选项显然已启用(我不知道为什么),所以以下命令未执行。

解决方案是修复有错误的代码、取消设置陷阱 ( trap - DEBUG) 或使用其他无错误的代码覆盖陷阱 ( trap 'other, non-buggy code' DEBUG)。

__vsc_preexec_only这是该函数或其调用的另一个函数中的错误。因此,据推测,这是 VSCode 中的一个错误。正如 Stéphane Chazelas 所指出的,该错误已被报告(在撰写本文时,有一个修复程序,但该修复程序仍然存在错误,看起来该代码的维护者不明白他们在做什么)。

相关内容