Pregunta 1En printf '%s\t%s\n' a b, ¿qué significan \t y \n?
Salida y reportes — escribir con printf y here-doc
Este artículo forma parte del Curso de Linux, con el que dominarás desde cero habilidades prácticas de Linux, desde los comandos básicos hasta los scripts de shell.
Alinea columnas con printf '%s\t%s\n', añade resultados con > y >>, separa los errores con 2> e incrusta $(wc -l) en una plantilla here-doc para construir un reporte de agregación, ilustrado y practicado en una terminal del navegador.
Dar formato a la salida — printf y hacia dónde va
Para que el resultado de un script se lea bien, eliges entre echo, que imprime una cadena tal cual, y printf, que toma un formato y alinea anchos y separadores.
Si solo quieres el valor de una variable en una línea, con echo "$v" basta.
Escribe printf '%s\t%s\n' name age y los argumentos entran en orden en los huecos %s, \t se convierte en un tabulador y \n en un salto de línea.
A diferencia de echo, printf no añade el salto de línea por ti, así que escribe siempre \n al final de la línea.
La salida de un comando llega por dos canales: la salida estándar y el error estándar.
> file sobrescribe un archivo con la salida estándar, >> file añade al final y 2> file envía solo el error estándar a un archivo aparte.
Envía los resultados correctos al reporte y los errores a su propio archivo y rastrear una causa después será mucho más fácil.
vi fmt.sh # abrir en el editor, escribir lo siguiente y guardar con :wq
# #!/bin/sh
# printf '%s\t%s\n' name age # encabezado separado por tabuladores
# printf '%s\t%s\n' alice 30 # fila de datos, alineada
# echo "done" >> fmt.log # añadir al log
chmod +x fmt.sh
./fmt.sh
> (sobrescribir) o >> (añadir), y los errores se desvían a otro archivo con 2>.| Sintaxis | Significado | Ejemplo |
|---|---|---|
echo "$v" | Imprimir una variable o una cadena tal cual | echo "$name" |
printf "%s\t%s\n" a b | Imprimir con un formato (separador de tabulador y salto de línea explícito) | printf '%s\t%s\n' name age |
> f | Sobrescribir un archivo con la salida estándar | echo line > report.txt |
>> f | Añadir la salida estándar a un archivo | echo more >> report.txt |
2> err | Desviar solo el error estándar a otro archivo | cat missing 2> err.log |
Reunir un reporte de agregación en un solo archivo — here-doc y sustitución de comandos
Para un reporte con un formato fijo, escribe la plantilla como here-doc y incrusta dentro los resultados de los comandos.
Las líneas que escribes entre cat > report.txt <<EOF … EOF pasan al archivo tal cual, y donde escribes $(...) se expande ahí mismo el resultado de ejecutar ese comando.
Un <<EOF sin comillas expande variables y sustituciones de comandos; <<'EOF' (con comillas simples) no expande nada e imprime el texto literal.
Captura los valores agregados, como conteos y sumas, con wc -l o grep -c dentro de una sustitución de comandos.
Una vez escrito el reporte, informa a quien lo llamó de si el trabajo salió bien, con un código de exit.
exit 0 significa éxito y exit 1 significa que algo falló, y un && posterior o una tarea de CI pueden actuar en consecuencia.
vi summary.sh # abrir en el editor, escribir lo siguiente y guardar con :wq
# #!/bin/sh
# log=access.log
# lines=$(wc -l < "$log") # contar las líneas
# cat > summary.txt <<REPORT # incrustar el valor en la plantilla
# --- access summary ---
# total lines: $lines
# REPORT
# echo "summary.txt created"
# exit 0
chmod +x summary.sh
$(wc -l) se incrusta en el punto $(...) de la plantilla here-doc, reuniéndolo todo en un solo reporte.| Sintaxis | Significado | Ejemplo |
|---|---|---|
<<EOF … EOF | here-doc que expande variables y sustituciones de comandos | cat <<EOF > t.txt |
<<'EOF' … EOF | here-doc que no expande nada e imprime el texto literal | cat <<'EOF' > t.txt |
$(wc -l < f) | Capturar un valor agregado con sustitución de comandos | n=$(wc -l < access.log) |
exit 0 / exit 1 | Devolver un código de salida de éxito o de fallo | exit 0 |
Separar la salida estándar y los errores en archivos distintos
Cuando un mismo comando produce resultados correctos y errores a la vez, escribe > ok.txt 2> err.txt y la salida estándar se guarda en ok.txt mientras el error estándar va a err.txt.
Como después puedes revisar los resultados y los problemas por separado, esta forma aparece mucho al diseñar el registro de los scripts de mantenimiento.
ls /etc /no_such_dir > ok.txt 2> err.txt # el listado a ok.txt, el error a err.txt
cat ok.txt # el listado de /etc (salida estándar)
cat err.txt # el error de /no_such_dir (error estándar)
> ok.txt y su error estándar a 2> err.txt, guardados por separado al mismo tiempo.| Sintaxis | Significado | Ejemplo |
|---|---|---|
cmd > ok 2> err | Enviar la salida estándar y el error estándar a archivos distintos a la vez | ls /etc > ok.txt 2> err.txt |
echo "…" 1>&2 | Enviar un mensaje al canal de error estándar | echo failed 1>&2 |
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué sintaxis redirige solo el error estándar de un comando a un archivo aparte?
Pregunta 3Cuando quieres incrustar el resultado de $(...) dentro de una plantilla here-doc, ¿qué etiqueta de apertura usas?