bash 'substituição de padrão' falha apenas em algumas condições

1

Por que o / a seguinte instrução printf se comportaria de maneira diferente com base em ...? (GNU bash, versão 4.4.18 (1) -release (x86_64-pc-linux-gnu))

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

Quando em uma sessão de terminal de usuário sem privilégios em tmux , a saída é:

screen-256color : screen_256color : screen?256color

No entanto, quando em um terminal root , para a mesma sessão tmux , a saída é:

xterm-256color : xterm_256color :

Fora de tmux , a saída é a mesma falha para todos os usuários:

xterm-256color : xterm_256color :

INFORMAÇÕES ADICIONAIS:

Eu apenas tentei a mesma linha de comando, mas substituindo o ponto de interrogação por um asterisco, e as mesmas falhas e sucessos ocorrem. Poderia ser um problema relacionado de alguma forma a globbing? O campo deve ser tratado como um valor de string, não um glob. Então tentei escapar do personagem e obter os seguintes resultados, para os seis casos de asterisco simples, com uma barra invertida, e com duas barras invertidas, para xterm-256color e screen-256-color casos mencionados acima:

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
    
por user1404316 13.03.2018 / 13:43

1 resposta

5

Eu posso reproduzir:

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

Isso porque nenhum arquivo corresponde ao padrão xterm?256color

Soluções:

  1. Cite suas variáveis :

    $ printf "%s : %s : %s\n" "$TERM" "${TERM//[^[:alnum:]]/_}" "${TERM//[^[:alnum:]]/?}"
    xterm-256color : xterm_256color : xterm?256color
    
  2. Desativar expansão de nome de arquivo

    $ (set -f; printf "%s : %s : %s\n" $TERM  ${TERM//[^[:alnum:]]/_} ${TERM//[^[:alnum:]]/?})
    xterm-256color : xterm_256color : xterm?256color
    
  3. Desativar a opção nullglob shell

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