Isso falha, pois printf interpreta algumas letras da barra invertida em seu primeiro argumento como especial.
Em geral, ao usar printf , você fornece
- Uma cadeia de formatação estática, possivelmente contendo marcadores para os dados que devem ser obtidos dos outros argumentos e
- 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.