Una opción es mirar los caracteres que está intentando usar con un visor o editor hexadecimal. hexdump
es una buena opción si está limitado al 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
Se puede ver aquí que el space
, close-square-brace
, space
son correctas - 0x20
, 0x5D
, 0x20
.
Estos valores son códigos ASCII, que se muestran en hexadecimal . Cualquier valor fuera del rango 0x20
- 0x7E
no es un " carácter imprimible " en lo que se refiere a ASCII, y lo más probable es que no va a jugar bien con interfaces de línea de comandos.
Nota: Copié su primera línea " rota " para usar en el hexdump
ejemplo anterior, por lo que algo ha reemplazado el espacio no ASCII con un espacio ASCII entre su fuente original y su pregunta representada.
Para repetir esto, siga los siguientes pasos:
- Escribe
hexdump -Cv <<"EOF"
y presionaEnter
- Pega el texto que te gustaría usar
- Escriba
EOF
en una línea propia y presioneEnter
Los terminales y las interfaces de línea de comandos no manejan bien los caracteres especiales, como ha descubierto. Si no tiene mucho cuidado con el formato de los documentos, también tendrá problemas con Microsoft Word (y otros) al usar " comillas inteligentes ", guiones, la lista continúa ...
Encuentra la diferencia: (la parte superior es " comillas inteligentes ", la parte inferior es " comillas rectas ")

$ 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
En este caso, las cotizaciones abiertas no son una cita simple ASCII ( "
), pero son unos Unicode / UTF-8 serie - 0xE2
, 0x80
, 0x9C
, o U+201C
- que el terminal no manejará como se podría esperar.
La sugerencia de Kiwy de cat -A
también hace el trabajo:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Nota: cuando se usaecho "..." | hd
, existe la posibilidad de que bash sustituya partes de la cadena que está tratando de inspeccionar. Esto es particularmente preocupante cuando se intenta inspeccionar los componentes de un script.
Por ejemplo, intente:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
Estos métodos están reemplazando componentes con el texto relevante. Para evitar esto, utilice uno de los siguientes enfoques. Tenga en cuenta el uso de comillas simples ( '
) y un " heredoc citado " ( "EOF"
).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}
history 2|xxd
(porque elhistory
comando en sí siempre es el último en la lista), o escribahistory|grep "CommandWithProblem"|xxd
. Puede usar cualquier otro programa de visualización hexadecimal en lugar dexxd
, pero esto por defecto es un formato que me gusta.set -x
. Esto le mostrará el comando y cómo se divide. No necesariamente diría "mal personaje aquí", pero te mostraría que bash no se estaba dividiendo en ese personaje.