Cómo imprimir nuevas líneas en la salida de la línea de comandos

Sorprendentemente, lograr que las computadoras proporcionen resultados legibles a los humanos no es tarea fácil. Con la introducción de flujos estándar y salida específicamente estándar, los programas obtuvieron una forma de comunicarse entre sí utilizando flujos de texto sin formato. Pero humanizar y mostrar stdout es otro asunto. La tecnología a lo largo de la era de la informática ha intentado resolver este problema, desde el uso de caracteres ASCII en las pantallas de las computadoras de video hasta los comandos de shell modernos como echoy printf.

Estos avances no han sido perfectos. El trabajo de imprimir la salida en una terminal está plagado de peculiaridades para que los programadores naveguen, como lo ejemplifica la tarea engañosamente no trivial de expandir una secuencia de escape para imprimir nuevas líneas. La expansión del marcador de posición \nse puede lograr de muchas formas, cada una con su propia historia y complicaciones únicas.

Utilizando echo

Desde su aparición en Multics hasta su ubicuidad de sistema moderno similar a Unix, echosigue siendo una herramienta familiar para hacer que su terminal diga "¡Hola mundo!" Desafortunadamente, las implementaciones inconsistentes en todos los sistemas operativos dificultan su uso. Mientras que echoen algunos sistemas se expandirán automáticamente las secuencias de escape, otros requieren una -eopción para hacer lo mismo:

echo "the study of European nerves is \neurology" # the study of European nerves is \neurology echo -e "the study of European nerves is \neurology" # the study of European nerves is # eurology

Debido a estas inconsistencias en las implementaciones, echose considera no portátil. Además, su uso junto con la entrada del usuario es relativamente fácil de corromper a través del ataque de inyección de shell usando sustituciones de comandos.

En los sistemas modernos, se conserva solo para proporcionar compatibilidad con los muchos programas que aún lo usan. La especificación POSIX recomienda el uso de printfen nuevos programas.

Utilizando printf

Desde la cuarta edición de Unix, el printfcomando portátil ha sido esencialmente el nuevo y mejor echo. Le permite utilizar especificadores de formato para humanizar la entrada. Para interpretar secuencias de escape de barra invertida, use %b. La secuencia de caracteres \ngarantiza que la salida finalice con una nueva línea:

printf "%b\n" "Many females in Oble are \noblewomen" # Many females in Oble are # oblewomen

Aunque printftiene más opciones que lo convierten en un reemplazo mucho más poderoso de echo, esta utilidad no es infalible y puede ser vulnerable a un ataque de cadena de formato no controlado. Es importante que los programadores se aseguren de manejar con cuidado las entradas del usuario.

Poner líneas nuevas en variables

En un esfuerzo por mejorar la portabilidad entre los compiladores, el estándar ANSI C se estableció en 1983. Con el uso de citas ANSI-C $'...', las secuencias de escape se reemplazan en la salida de acuerdo con el estándar.

Esto nos permite almacenar cadenas con nuevas líneas en variables que se imprimen con las nuevas líneas interpretadas. Puede hacer esto configurando la variable, luego llamándola printfusando $:

puns=$'\number\narrow\nether\nice' printf "%b\n" "These words started with n but don't make $puns" # These words started with n but don't make # umber # arrow # ether # ice

La variable expandida está entre comillas simples, que se pasa literalmente a printf. Como siempre, es importante manejar adecuadamente la entrada.

Ronda de bonificación: expansión de parámetros de shell

En mi artículo que explica Bash y llaves, cubrí la magia de la expansión de parámetros de shell. También podemos usar una expansión`` ${[email protected]}para interpretar secuencias de escape. Usamos printfel %sespecificador de para imprimir como una cadena, y el Eoperador expandirá adecuadamente las secuencias de escape en nuestra variable:

printf "%s\n" ${[email protected]} # umber # arrow # ether # ice

El desafío continuo de hablar en humanos

La interpolación de cadenas sigue siendo un problema masticable para los programadores. Además de lograr que los lenguajes y los shells estén de acuerdo en lo que significan ciertos marcadores de posición, el uso adecuado de las secuencias de escape correctas requiere un ojo para los detalles.

Una mala interpolación de cadenas puede dar lugar a una salida de apariencia tonta, así como a introducir vulnerabilidades de seguridad, como los ataques de inyección. Hasta que la próxima evolución del terminal nos haga hablar en emojis, es mejor que prestemos atención cuando imprimamos resultados para humanos.