Varias versiones de strings
han existido. La mayoría de ellos simplemente buscan un cierto número (cuatro o más) de caracteres ASCII imprimibles, y deciden, sin contexto, que ha encontrado una "cadena" legible por humanos. Este parece ser el caso de la strings
comando.
GNU gstrings
parece ser mucho más inteligente. No tengo gstrings
instalado, pero parece que utiliza una heurística un poco más inteligente que la mera búsqueda de caracteres ASCII imprimibles. (Hace unos 40 años, en una clase de programación en C que tomé, una de nuestras tareas era escribir una versión mejor de strings
. No era muy difícil).
Para entender mejor la discrepancia, te sugiero que utilices otra utilidad, hexdump
.
hexdump -C /bin/ls
le mostrará los códigos hexadecimales en una tabla para cada byte del archivo, con interpretaciones ASCII de los mismos al final de cada fila:
00000000 cf fa ed fe 07 00 00 01 03 00 00 00 02 00 00 00 |................|
00000010 13 00 00 00 10 07 00 00 85 00 20 00 00 00 00 00 |.......... .....|
00000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 |....H...__PAGEZE|
00000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |RO..............|
00000040 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 19 00 00 00 28 02 00 00 |............(...|
00000070 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
00000080 00 00 00 00 01 00 00 00 00 50 00 00 00 00 00 00 |.........P......|
00000090 00 00 00 00 00 00 00 00 00 50 00 00 00 00 00 00 |.........P......|
Como puede ver, las mismas cadenas "reales" legibles por humanos que se muestran a la derecha también están en el gstrings
de salida.
Por lo tanto, la respuesta sencilla es que GNU strings
hace un mejor trabajo que el BSD por defecto strings
.