bash "패턴 교체"는 특정 상황에서만 실패합니다.

bash "패턴 교체"는 특정 상황에서만 실패합니다.

다음 명령문이 다음에 따라 다르게 동작하는 이유는 무엇 printf입니까? (GNU bash, 버전 4.4.18(1)-릴리스(x86_64-pc-linux-gnu))

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?}

권한이 없는 사용자 터미널 세션에 있을 때 tmux출력은 다음과 같습니다.

screen-256color : screen_256color : screen?256color

그러나 터미널에서 root동일한 tmux세션에 대한 출력은 다음과 같습니다.

xterm-256color : xterm_256color :

이 외부에서는 tmux모든 사용자에 대한 출력이 동일한 실패입니다.

xterm-256color : xterm_256color :

추가 정보:

방금 동일한 명령줄을 시도했지만 물음표를 별표로 바꾸었고 동일한 실패와 성공이 발생했습니다. 와일드카드 관련 문제일 수 있나요? 이 필드는 전역 값이 아닌 문자열 값으로 처리되어야 합니다. 그런 다음 문자를 이스케이프 처리하려고 시도했고 위에서 언급한 및 사례에 대해 하나의 백슬래시와 두 개의 백슬래시가 있는 별표 일반의 6가지 경우에 대해 다음과 같은 결과를 얻었습니다 xterm-256color.screen-256-color

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/*}

screen-256color : screen_256color : screen*256color
xterm-256color : xterm_256color :

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/\*}

screen-256color : screen_256color : screen*256color
xterm-256color : xterm_256color :

printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/\\*}

screen-256color : screen_256color : screen\*256color
xterm-256color : xterm_256color : xterm\*256color

답변1

나는 재현할 수 있습니다:

$ printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?}
xterm-256color : xterm_256color :

일치하는 파일이 없기 때문입니다.무늬 xterm?256color

해결책:

  1. 변수 참조:

    $ printf "%s : %s : %s\n" "$TERM" "${TERM//[^[:alnum:]]/_}" "${TERM//[^[:alnum:]]/?}"
    xterm-256color : xterm_256color : xterm?256color
    
  2. 파일 이름 확장자 끄기

    $ (set -f; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
    xterm-256color : xterm_256color : xterm?256color
    
  3. nullglob셸 옵션 끄기

    $ (shopt -u nullglob; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
    xterm-256color : xterm_256color : xterm?256color
    

관련 정보