Usando printf quando string possui barra invertida

0

Estou tentando printf e export a variável usada para definir PS1 , mas tudo que tentei retorna erro em printf ou coloca literal \u em prompt.

v='\u\$'; printf "$v"; export PS1="$v"
-bash: printf: missing unicode digit for \u

v='\u\$'; printf "$v"; export PS1="$v"
\u$

v=$'\u'; v+='\$'; printf "${v}"; export PS1="${v}"
-bash: printf: missing unicode digit for \u

Existe uma maneira de formatar $v para fazer com que printf e export funcionem?

    
por Buoy 10.03.2018 / 16:25

1 resposta

7

Isso falha, pois printf interpreta algumas letras da barra invertida em seu primeiro argumento como especial.

Em geral, ao usar printf , você fornece

  1. Uma cadeia de formatação estática, possivelmente contendo marcadores para os dados que devem ser obtidos dos outros argumentos e
  2. Outros dados variáveis a serem usados nos espaços reservados na string de formatação estática.

Isso significa que o primeiro argumento para printf pode sempre ser uma única string entre aspas.

No shell, você pode usar apenas %s como um espaço reservado para praticamente qualquer coisa na string de formatação, a menos que você queira coisas como preenchimento da esquerda / direita (por exemplo, %20s para usar 20 caracteres em uma string justificada à direita) ou %-20s para uma string justificada à esquerda), um determinado número de casas decimais em floats ( %.3f para três casas decimais) ou preenchimento zero de inteiros ( %08d para oito dígitos, preenchimento zero) etc.

Por exemplo, para imprimir sua string, use %s na string de formatação:

v='\u\$'
printf 'PS1 will be set to "%s"\n' "$v"   # or just:  printf '%s\n' "$v"
PS1="$v"

ou

PS1='\u\$'
printf 'PS1 was set to "%s"\n' "$PS1"   # or just:  printf '%s\n' "$PS1"

Isto irá produzir

PS1 will be set to "\u\$"

e

PS1 was set to "\u\$"

Veja printf(1) e / ou printf(3) no seu sistema ( man 1 printf e man 3 printf ).

Note também que PS1 não precisará ser exportado.

    
por 10.03.2018 / 16:42