我升级到 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 所指出的,该错误已被报告(在撰写本文时,有一个修复程序,但该修复程序仍然存在错误,看起来该代码的维护者不明白他们在做什么)。