Linux-Mint

ls: bash: printf: `Y’: VS Code 中的格式字元無效,終端中沒有

  • August 7, 2022

我升級到 Linux Mint 21(基於 Ubuntu 22),有一些小問題,其中一個是在VS Code中,而不是在終端(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 程式碼中**。**

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

Bash 可以通過啟用DEBUG trap在執行目前命令之前處理它的文本。這最初是為調試而設計的,但它通常用於在命令執行時將視窗標題設置為命令的文本。

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 所指出的,該錯誤已被報告(在撰寫本文時,有一個修復,但修復仍然存在錯誤,看起來該程式碼的維護者不明白他們在做什麼)。

引用自:https://unix.stackexchange.com/questions/712709