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 배쉬 옵션함정 작동 방식을 조정했습니다 DEBUG. 이에 대한 한 가지 효과는 트랩 코드가 DEBUG0이 아닌 상태를 반환하는 경우 명령이 실행되지 않는다는 것입니다.

VSCode의 구성은 DEBUG트랩을 설정합니다( trap -p DEBUG설정된 경우 코드 표시). 이는 실행 중인 명령의 텍스트로 창 제목을 설정할 가능성이 높습니다. 이 코드에는 버그가 있어 printf특정 형식으로 명령을 전달하려고 시도하는 것 같습니다. 명령에 백슬래시 또는 백분율 기호가 포함되어 있으면 중단됩니다. 옵션이 분명히 활성화되어 있기 때문에 extdebug(이유는 모르겠습니다) 다음 명령은 실행되지 않습니다.

해결 방법은 버그가 있는 코드를 수정하거나 트랩 설정을 해제 trap - DEBUG하거나( ) 트랩을 trap 'other, non-buggy code' DEBUG버그가 없는 다른 코드로 덮어쓰는 것입니다.

__vsc_preexec_only이는 이 함수 또는 해당 함수가 호출하는 다른 함수의 오류입니다. 아마도 이것은 VSCode의 버그일 것입니다. Stéphane Chazelas가 지적했듯이,이 버그가 보고되었습니다.(이 글을 쓰는 시점에는 수정 사항이 있지만 수정 사항은 여전히 ​​버그가 있으며 코드 관리자가 자신이 수행하는 작업을 이해하지 못하는 것 같습니다.)

관련 정보