Podrías usar cat
con el -A
opción:del manual:
-A, --show-all
equivalent to -vET
-E, --show-ends
display $ at end of each line
-T, --show-tabs
display TAB characters as ^I
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
Así que cat -A yourscrip.sh
te mostrará personajes invisibles y extraños.
Una opción es mirar los caracteres que está tratando de usar con un visor o editor hexadecimal. hexdump
es una buena opción si estás 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
Puedes ver aquí que el space
, close-square-brace
, space
son correctos - 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 respecta a ASCII, y lo más probable es que no funcione bien con las interfaces de línea de comandos.
Nota: Copié tu primer "roto " línea para usar en el hexdump
ejemplo anterior, por lo que algo ha reemplazado el no-un-espacio-ASCII con un espacio ASCII entre la fuente original y la pregunta presentada.
Para repetir esto, sigue los siguientes pasos:
- Escriba
hexdump -Cv <<"EOF"
y presione Entrar - Pegue el texto que le gustaría usar
- Escriba
EOF
en una línea propia y presione Enter
Las 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) usando "comillas tipográficas ", em-guiones, la lista continúa...
Encuentra la diferencia:(la parte superior es "comillas tipográficas ", 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
Aquí, las comillas abiertas no son simples comillas ASCII ("
), pero son una serie Unicode/UTF-8 - 0xE2
, 0x80
, 0x9C
o U+201C
- que la terminal no manejará como cabría esperar.
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: al usar echo "..." | hd
, tiene la posibilidad de que bash sustituya partes de la cadena que está tratando de inspeccionar. Esto es especialmente preocupante cuando se intenta inspeccionar componentes de un script.
Por ejemplo, intente:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
Estos métodos reemplazan componentes con el texto relevante. Para evitar esto, utilice uno de los siguientes enfoques. Tenga en cuenta el uso de comillas simples ('
), y un "quoted heredoc " ("EOF"
).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}
echo "<your command>" | hd
Deberia trabajar. Busque retroceso (0x08) o caracteres con códigos>=80. echo "<your command>" | wc -b
y verificar que el conteo coincida con lo que ve también es una buena idea.
Copiar cosas de archivos producidos por cualquier cosa con "Office" en su nombre es peligroso, porque dicho software a menudo se toma la libertad de reemplazar caracteres:en francés, busque comillas dobles reemplazadas por "guillemets", en inglés para comillas simples reemplazadas por sus equivalentes abrir/cerrar. El más difícil que encontré fue un espacio de ancho 0 que no se rompe en medio de un nombre de archivo (3 días de tiempo de inactividad del servidor...).