Vous pouvez notamment examiner les caractères que vous essayez d'utiliser à l'aide d'un visualiseur ou d'un éditeur hexagonal. hexdump
est une bonne option si vous êtes limité au 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
Vous pouvez voir ici que le space
, close-square-brace
, space
sont correctes - 0x20
, 0x5D
, 0x20
.
Ces valeurs sont des codes ASCII, affichés en format hexadécimal . Toute valeur en dehors de la plage 0x20
- 0x7E
n'est pas un " caractère imprimable " en ce qui concerne l'ASCII, et il est fort probable qu'il ne soit pas compatible avec les interfaces de ligne de commande.
Note : J'ai copié votre premier " brisé "pour l'utilisation dans le hexdump
exemple ci-dessus, donc quelque chose a remplacé l pas un espace ASCII avec un espace ASCII entre votre source originale et votre question rendue.
Pour répéter cette opération, procédez comme suit :
- Type
hexdump -Cv <<"EOF"
et appuyez sur Enter
- Collez le texte que vous souhaitez utiliser
- Type
EOF
sur une ligne à part, et appuyez sur Enter
Les terminaux et les interfaces de ligne de commande ne gèrent pas bien les caractères spéciaux - comme vous l'avez découvert. Si vous ne faites pas très attention au formatage de vos documents, vous aurez également des problèmes avec Microsoft Word (et d'autres) qui utilise les caractères " citations intelligentes ", em-dashes, la liste est longue...
Voyez la différence : (le haut est " citations intelligentes ", le bas est " citations droites ")
$ 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
Ici, les guillemets ouverts ne sont pas une simple citation ASCII ( "
), mais sont un Unicode / UTF-8 série - 0xE2
, 0x80
, 0x9C
, oder U+201C
- que le terminal ne traitera pas comme on pourrait s'y attendre.
La suggestion de Kiwy de cat -A
fait également l'affaire :
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Note : lors de l'utilisation de echo "..." | hd
vous avez une chance que bash substitue des parties de la chaîne que vous essayez d'inspecter. Ceci est particulièrement préoccupant lorsque vous essayez d'inspecter les composants d'un script.
Essayez par exemple :
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
Ces méthodes consistent à remplacer les composants par le texte correspondant. Pour éviter cela, utilisez l'une des approches suivantes. Notez l'utilisation de guillemets simples ( '
), et un " cité heredoc " ( "EOF"
).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}