Uma opção é observar os caracteres que você está tentando usar com um visualizador ou editor hexadecimal. hexdump
é uma boa opção se você estiver limitado ao terminal.
$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000 5b 20 2d 66 20 2f 65 74 63 2f 6f 70 65 6e 76 70 |[ -f /etc/openvp|
00000010 6e 2f 63 6c 69 65 6e 74 2e 63 6f 6e 66 20 5d 20 |n/client.conf ] |
00000020 26 26 20 65 63 68 6f 20 74 72 75 65 0a |&& echo true.|
0000002d
Você pode ver aqui que os space
, close-square-brace
, space
estão corretos - 0x20
, 0x5D
, 0x20
.
Esses valores são códigos ASCII, exibidos em hexadecimal . Qualquer valor fora do intervalo 0x20
- 0x7E
não é um " caractere imprimível " no que diz respeito ao ASCII, e provavelmente não funcionará bem com interfaces de linha de comando.
Observação: copiei sua primeira linha " quebrada " para usar no exemplo hexdump
acima, então algo substituiu o not-an-ASCII -space com um espaço ASCII entre sua fonte original e sua pergunta renderizada.
Para repetir isso, siga os seguintes passos:
- Digite
hexdump -Cv <<"EOF"
e pressione Enter - Cole o texto que você gostaria de usar
- Digite
EOF
em uma linha própria e pressione Enter
Terminais e Interfaces de Linha de Comando não lidam bem com caracteres especiais - como você descobriu. Se você não é muito cuidadoso com a formatação de documentos, você também terá problemas com o Microsoft Word (e outros) usando " aspas inteligentes ", em traços, a lista continua ...
Descubra a diferença: (a parte superior é " citações inteligentes ", a parte inferior é " citações diretas ")
$hexdump-Cv<<"EOF"
> “quoted string”
> EOF
00000000 e2 80 9c 71 75 6f 74 65 64 20 73 74 72 69 6e 67 |...quoted string|
00000010 e2 80 9d 0a |....|
00000014
Aqui, as aspas abertas não são uma simples cotação ASCII ( "
), mas são um Unicode / UTF-8 série - 0xE2
, 0x80
, 0x9C
ou U+201C
- que o terminal não vai funcionar como você poderia esperar.
A sugestão de Kiwy de cat -A
também faz o trabalho:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Observação: ao usar echo "..." | hd
, você tem a chance de que o bash substitua partes da string que você está tentando inspecionar. Isso é particularmente preocupante ao tentar inspecionar componentes de um script.
Por exemplo, tente:
$ echo "${USER}"
attie
$ echo "'whoami'"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
Esses métodos estão substituindo componentes pelo texto relevante. Para evitar isso, use uma das seguintes abordagens. Observe o uso de aspas simples ( '
) e um " citado heredoc " ( "EOF"
).
$ echo '${USER}'
${USER}
$ echo ''whoami''
'whoami'
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}