Prefacio

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Todos los sistemas operativos modernos tienen al menos un intérprete de comandos, y algunos tienen muchos. Algunas shell están orientadas a la línea de comandos, como la shell de la que se habla en este libro. Otras son gráficas, como el Explorador de Windows o el Finder de Macintosh. Algunos usuarios interactuarán con el intérprete de comandos sólo el tiempo suficiente para iniciar su aplicación favorita, y luego nunca saldrán de él hasta que cierren la sesión. Pero la mayoría de los usuarios pasan mucho tiempo utilizando el shell. Cuanto más conozcas tu shell, más rápido y productivo podrás ser.

Tanto si eres administrador de sistemas, programador o usuario final, seguro que hay ocasiones en las que un simple (o quizá no tan simple) script de shell puede ahorrarte tiempo y esfuerzo, o facilitar la coherencia y repetibilidad de alguna tarea importante. Incluso utilizar un alias para cambiar o acortar el nombre de un comando que utilizas a menudo puede tener un efecto significativo. Trataremos esto y mucho más.

Como ocurre con cualquier lenguaje de programación general, hay más de una forma de realizar una tarea determinada en el shell. En algunos casos, sólo hay una forma mejor, pero en la mayoría de los casos hay al menos dos o tres formas igualmente eficaces y eficientes de escribir una solución. La forma que elijas dependerá de tu estilo personal, creatividad y familiaridad con los distintos comandos y técnicas. Esto es tan cierto para nosotros como autores como para ti como lector. En la mayoría de los casos elegiremos un único método y lo aplicaremos. En unos pocos casos podemos elegir un método concreto y explicar por qué creemos que es el mejor. También podemos mostrar ocasionalmente más de una solución equivalente para que puedas elegir la que mejor se adapte a tus necesidades y a tu entorno.

A veces también hay que elegir entre una forma inteligente de escribir código y una forma legible. Elegiremos siempre la forma legible porque la experiencia nos ha enseñado que, por muy transparente que creas que es tu código inteligente ahora, dentro de 6 ó 18 meses y 10 proyectos te estarás rascando la cabeza preguntándote en qué estabas pensando. Confía en nosotros: escribe código claro y documéntalo; te lo agradecerás (y nos lo agradecerás) más tarde.

Quién debería leer este libro

Este libro está dirigido a cualquier persona que utilice un sistema Unix o Linux, así como a administradores de sistemas que puedan utilizar varios sistemas en un día cualquiera. Con él, podrás crear guiones que te permitan hacer más cosas, en menos tiempo, de forma más fácil, coherente y repetible que nunca.

¿Cualquiera? Sí. Los nuevos usuarios apreciarán las secciones sobre automatización de tareas repetitivas, realización de sustituciones sencillas y personalización de su entorno para que sea más amigable y quizá se comporte de formas más familiares. Los usuarios avanzados y los administradores encontrarán soluciones nuevas y diferentes a tareas y retos habituales. Los usuarios avanzados dispondrán de una colección de técnicas que podrán utilizar en un momento dado para apagar el último incendio, sin tener que recordar cada pequeño detalle de sintaxis.

Los lectores ideales son:

  • Nuevos usuarios de Unix o Linux que no saben mucho sobre el shell, pero quieren hacer algo más que apuntar y hacer clic

  • Usuarios experimentados de Unix o Linux y administradores de sistemas que buscan respuestas rápidas a preguntas sobre shell scripting

  • Programadores que trabajan en un entorno Unix o Linux (o incluso Windows) y quieren ser más productivos

  • Nuevos administradores de sistemas Unix o Linux, o los que proceden de un entorno Windows y necesitan ponerse al día rápidamente

  • Usuarios experimentados de Windows y administradores de sistemas que desean un entorno de scripting más potente

Este libro sólo tratará brevemente el shell scripting básico e intermedio: consulta Aprendiendo el Shell bash, 3ª Edición, de Cameron Newham (O'Reilly) y Classic Shell Scripting de Nelson H. F. Beebe y Arnold Robbins (O'Reilly) para una cobertura más profunda. En lugar de eso, nuestro objetivo es ofrecer soluciones a problemas comunes, centrándonos más en el "cómo hacerlo" que en la teoría. Esperamos que este libro te ahorre tiempo a la hora de encontrar soluciones o de recordar la sintaxis. De hecho, esa es la razón por la que escribimos este libro: es lo que queríamos, uno que pudiéramos leer para obtener ideas, y luego consultar para ver ejemplos prácticos de trabajo cuando fuera necesario. Así no tendríamos que recordar las sutiles diferencias entre el shell, Perl, C, etc.

Este libro asume que tienes acceso a un sistema Unix o Linux (o consulta las Recetas 1.14 a 1.18, o la Receta 15.4) y que estás familiarizado con el inicio de sesión, la escritura de comandos básicos y el uso de un editor de texto. No es necesario que seas root para utilizar la gran mayoría de las recetas, aunque hay unas pocas, sobre todo las que tratan de la instalación de bash, en las que se necesitará acceso root.

Acerca de este libro

Este libro trata de bash, la GNU Bourne Again Shell, que es miembro de la familia de shells que incluye la shell Bourne original, sh, la shell Korn, ksh, y la shell Korn de dominio público, pdksh. Aunque estos y otros shells como dash y zsh no se tratan específicamente, lo más probable es que la mayoría de los scripts funcionen bastante bien con ellos.

Deberías poder leer este libro de principio a fin, y también cogerlo y leer cualquier cosa que te llame la atención. Pero quizás lo más importante es que esperamos que cuando tengas una pregunta sobre cómo hacer algo o necesites una pista, puedas encontrar fácilmente la respuesta correcta -o algo lo bastante parecido- y ahorrar tiempo y esfuerzo.

Gran parte de la filosofía Unix consiste en construir herramientas sencillas que hagan bien una cosa, y luego combinarlas según sea necesario. Esta combinación de herramientas se realiza a menudo mediante un script de shell porque estos comandos, llamados pipelines, pueden ser largos o difíciles de recordar y teclear. Cuando proceda, cubriremos el uso de muchas de estas herramientas en el contexto del script de shell como el pegamento que mantiene unidas las piezas para lograr el objetivo.

La primera edición de este libro se escribió utilizando OpenOffice.org Writer en cualquier máquina Linux o Windows que se tuviera a mano, y se guardó en Subversion (véase el Apéndice D). La naturaleza del Formato de Documento Abierto facilitó muchos aspectos críticos de la redacción de este libro, como las referencias cruzadas y la extracción de código (ver Receta 13.18). Ese código fuente se convirtió posteriormente a DocBook para su producción.

Para la segunda edición, hemos cambiado a Asciidoc y Git en el sistema Atlas de O'Reilly, que ha funcionado muy bien. Agradecemos a los departamentos de producción y herramientas de O'Reilly su ayuda.

Software GNU

bash y muchas de las demás herramientas que tratamos en este libro forman parte del Proyecto GNU. GNU (pronunciado guh-noo, como canoa) es un acrónimo recursivo de "GNU No es Unix", y el proyecto se remonta a 1984. Su objetivo es desarrollar un sistema operativo libre (como en libertad) similar a Unix.

Sin entrar en demasiados detalles, lo que comúnmente se conoce como Linux es, de hecho, un núcleo con varios programas de apoyo como núcleo. Las herramientas GNU lo envuelven y tiene una amplia gama de otro software que puede estar incluido, dependiendo de tu distribución. Sin embargo, el núcleo Linux en sí no es software GNU.

El Proyecto GNU argumenta que, de hecho, Linux debería llamarse "GNU/Linux", y tiene razón, por lo que algunas distribuciones (sobre todo Debian) así lo hacen. Por tanto, podría decirse que se ha logrado el objetivo de GNU, aunque el resultado no sea exclusivamente GNU.

El Proyecto GNU ha contribuido con una gran cantidad de software superior, entre el que destaca bash. Hay versiones GNU de prácticamente todas las herramientas que tratamos en este libro, y aunque las herramientas GNU son más ricas en cuanto a funciones y (normalmente) más fáciles de usar, a veces también son un poco diferentes. Hablamos de ello en la Receta 15.3, aunque los vendedores comerciales de Unix de los años 80 y 90 también son en gran parte culpables de estas diferencias.

Ya se ha hablado bastante (por valor de varios libros de este tamaño) sobre todos estos aspectos de GNU, Unix y Linux, pero nos ha parecido oportuna esta breve nota. Consulta http://www.gnu.org para saber mucho más sobre el tema.

Nota sobre los ejemplos de código

Cuando en este libro mostramos un fragmento ejecutable de shell scripting, normalmente lo mostramos en un área de desplazamiento como ésta:

$ ls
a.out  cong.txt  def.conf  file.txt  more.txt  zebra.list
$

El primer carácter suele ser un signo de dólar ($) para indicar que este comando se ha escrito en el prompt del shell bash. (Recuerda que puedes cambiar el prompt, como se describe en la Receta 16.2, por lo que tu prompt puede tener un aspecto muy diferente). El intérprete de comandos imprime el prompt; tú escribes el resto de la línea. Del mismo modo, la última línea de un ejemplo de este tipo suele ser un prompt (el $ de nuevo), para mostrar que el comando ha finalizado su ejecución y el control ha vuelto al shell.

El símbolo de almohadilla (#) es un poco más complicado. En muchos archivos Unix o Linux, incluidos los scripts de shell bash, un # al principio indica un comentario, y así lo hemos utilizado en algunos de nuestros ejemplos de código. Pero como símbolo final en un símbolo de sistema bash (en lugar de $), # significa que has iniciado sesión como root. Sólo tenemos un ejemplo en el que se ejecuta algo como root, así que no debería ser confuso, pero es importante entenderlo.

Cuando veas un ejemplo sin la cadena prompt, estamos mostrando el contenido de un script de shell. En varios ejemplos grandes numeraremos las líneas del script, aunque los números no formen parte del script.

También podemos mostrar ocasionalmente un ejemplo como un registro de sesión o una serie de comandos. En algunos casos, podemos cat uno o más archivos para que puedas ver el script y/o los archivos de datos que utilizaremos en el ejemplo o en los resultados de nuestra operación, como en este caso:

$ cat data_file
static header line1
static header line2
1 foo
2 bar
3 baz

Muchos de los guiones y funciones más largos también están disponibles para descargar. Consulta "Utilizar ejemplos de código" para más detalles. Hemos elegido utilizar !/usr/bin/env bash para estos ejemplos, cuando proceda, ya que es más portable que el !/bin/bash que verás en Linux o en un Mac. Consulta la Receta 15.1 para más detalles.

Además, puede que observes algo como lo siguiente en muchos ejemplos de código:

# cookbook filename: snippet_name

Eso significa que el código que estás leyendo está disponible para su descarga en nuestro repositorio de GitHub. Encontrarás el código en algo como . /chXX/snippet_name, donde chXX es el capítulo y snippet_name es el nombre del archivo.

Uso inútil del gato

Algunos usuarios de Unix se deleitan señalando las ineficiencias del código de otras personas. La mayoría de las veces se trata de una crítica constructiva, ofrecida con amabilidad y recibida con gratitud.

Probablemente, el caso más común es el llamado "premio al uso inútil de cat " que se otorga cuando alguien hace algo como cat file | grep foo en lugar de simplemente grep foo file. En este caso, cat es innecesario e incurre en cierta sobrecarga del sistema, ya que se ejecuta en un subproceso. Otro caso común sería cat file | tr '[A-Z]' '[a-z]' en lugar de tr '[A-Z]' '[a-z]' < file. A veces, el uso de cat puede incluso hacer que tu script falle (ver Receta 19.8).

Pero... (ya lo sabías, ¿verdad?) a veces utilizar cat innecesariamente sirve para algo. Puede que sea un marcador de posición para mostrar un fragmento de una cadena, al que luego sustituirán otros comandos (quizás incluso cat -n). O puede que colocar el archivo cerca de la parte izquierda del código atraiga la mirada hacia él más claramente que si estuviera oculto tras un < en el extremo derecho de la página.

Aunque aplaudimos la eficiencia y estamos de acuerdo en que es un objetivo al que hay que aspirar, ya no es tan crítica como antes. No abogamos por el descuido y la hinchazón de código, sólo decimos que los procesadores no van a volverse más lentos en breve. Así que si te gusta el gato, úsalo.

Una nota sobre Perl

Hemos decidido conscientemente evitar el uso de Perl en nuestras soluciones en la medida de lo posible, aunque todavía hay algunos casos en los que tiene sentido. Perl ya está cubierto en otros sitios con mucha más profundidad y amplitud de la que podríamos conseguir aquí. Y las soluciones en Perl suelen ser mucho más grandes, con una sobrecarga significativamente mayor, que las nuestras. También existe una delgada línea entre las secuencias de comandos shell y las secuencias de comandos Perl, y éste es un libro sobre secuencias de comandos shell.

El shell scripting es básicamente pegamento para unir programas Unix, mientras que Perl incorpora gran parte de la funcionalidad de los programas Unix externos en el propio lenguaje. Esto lo hace más eficiente y, en cierto modo, más portátil, a costa de ser diferente y dificultar la ejecución eficiente de los programas externos que aún necesites.

La elección de qué herramienta utilizar a menudo tiene más que ver con la familiaridad que con cualquier otra razón. Lo fundamental es siempre hacer el trabajo; la elección de las herramientas es secundaria. Te mostraremos muchas formas de hacer las cosas utilizando bash y las herramientas relacionadas. Cuando necesites hacer tu trabajo, tú eliges qué herramientas utilizas.

Más recursos

Convenciones utilizadas en este libro

En este libro se utilizan las siguientes convenciones tipográficas:

Texto sin formato

Indica títulos de menú, opciones de menú, botones de menú y aceleradores de teclado (como Alt y Ctrl).

Cursiva

Indica nuevos términos, URL, direcciones de correo electrónico, nombres de archivo, extensiones de archivo, rutas de acceso, directorios y utilidades Unix.

Constant width

Indica comandos, opciones, conmutadores, variables, atributos, claves, funciones, tipos, clases, espacios de nombres, métodos, módulos, propiedades, parámetros, valores, objetos, eventos, controladores de eventos, etiquetas XML, etiquetas HTML, macros, el contenido de los archivos y la salida de los comandos.

Constant width bold

Muestra comandos u otros textos que deben ser tecleados literalmente por el usuario.

Constant width italic

Muestra el texto que debe ser sustituido por valores proporcionados por el usuario.

Nota

Este icono significa una nota general.

Consejo

Este icono significa un consejo o sugerencia.

Advertencia

Este icono indica una advertencia o precaución.

Utilizar ejemplos de código

El material complementario (ejemplos de código, ejercicios, etc.) se puede descargar en https://github.com/vossenjp/bashcookbook-examples.

Este libro está aquí para ayudarte a hacer tu trabajo. En general, si se ofrece código de ejemplo con este libro, puedes utilizarlo en tus programas y documentación. No es necesario que te pongas en contacto con nosotros para pedirnos permiso, a menos que estés reproduciendo una parte importante del código. Por ejemplo, escribir un programa que utilice varios trozos de código de este libro no requiere permiso. Vender o distribuir un CD-ROM de ejemplos de los libros de O'Reilly sí requiere permiso. Responder a una pregunta citando este libro y el código de ejemplo no requiere permiso. Incorporar una cantidad significativa de código de ejemplo de este libro en la documentación de tu producto sí requiere permiso.

Agradecemos, pero no exigimos, la atribución. Una atribución suele incluir el título, el autor, la editorial y el ISBN. Por ejemplo "bash Cookbook, 2ª Edición, por Carl Albing y JP Vossen. Copyright 2018 Carl Albing y JP Vossen, 978-1-491-97533-6".

Si crees que el uso que haces de los ejemplos de código no se ajusta al uso legítimo o al permiso concedido anteriormente, no dudes en ponerte en contacto con nosotros en

Safari O'Reilly

Nota

Safari (antes Safari Books Online) es una plataforma de formación y referencia basada en membresías para empresas, administraciones públicas, educadores y particulares.

Los miembros tienen acceso a miles de libros, vídeos de formación, rutas de aprendizaje, tutoriales interactivos y listas de reproducción de más de 250 editoriales, como O'Reilly Media, Harvard Business Review, Prentice Hall Professional, Addison-Wesley Professional, Microsoft Press, Sams, Que, Peachpit Press, Adobe, Focal Press, Cisco Press, John Wiley & Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe Press, FT Press, Apress, Manning, New Riders, Jones & Bartlett y Course Technology, entre otras. Sons, Syngress, Morgan Kaufmann, IBM Redbooks, Packt, Adobe Press, FT Press, Apress, Manning, New Riders, McGraw-Hill, Jones & Bartlett y Course Technology, entre otras.

Para más información, visita http://oreilly.com/safari.

Nos gustaría saber de ti

Dirige tus comentarios y preguntas sobre este libro a la editorial:

  • O'Reilly Media, Inc.
  • 1005 Gravenstein Highway Norte
  • Sebastopol, CA 95472
  • 800-998-9938 (en Estados Unidos o Canadá)
  • 707-829-0515 (internacional o local)
  • 707-829-0104 (fax)

Tenemos una página web para este libro, donde se enumeran erratas, ejemplos y cualquier información adicional. Puedes acceder a esta página en http://bit.ly/bash_cookbook_2E.

Puedes encontrar información sobre este libro, ejemplos de código, erratas, enlaces, documentación bash y mucho más en el sitio de los autores, http://www.bashcookbook.com.

Por favor, pásate a visitarnos para aprender, contribuir o charlar. A los autores les encantaría que les dijeras qué te gusta y qué no te gusta del libro, qué maravillas de bash has encontrado o qué lecciones has aprendido. Para comentar o hacer preguntas técnicas sobre este libro, envía un correo electrónico a bookquestions@oreilly.com.

Para más información sobre nuestros libros, cursos, conferencias y noticias, consulta nuestro sitio web en http://www.oreilly.com.

Encuéntranos en Facebook: http://facebook.com/oreilly

Síguenos en Twitter: http://twitter.com/oreillymedia

Míranos en YouTube: http://www.youtube.com/oreillymedia

Agradecimientos

Gracias a la Fundación del Software GNU y a Brian Fox por escribir bash. Y gracias a Chet Ramey, que ha estado manteniendo y mejorando bash desde aproximadamente la versión 1.14, a principios o mediados de los noventa. Más gracias a Chet por responder a nuestras preguntas y por revisar un borrador de este libro.

Un agradecimiento especial, también, a Cameron Newham, que proporcionó material para la primera edición, parte del cual permanece en esta edición. Recomendamos encarecidamente su libro de O'Reilly, Learning the bash Shell, escrito por Cameron Newham y Bill Rosenblatt.

Revisores

¡Muchas gracias a nuestros revisores! Todos ellos han aportado valiosos comentarios, sugerencias y, en algunos casos, soluciones alternativas, han señalado cuestiones que habíamos pasado por alto y, en general, han mejorado mucho el libro. Cualquier error u omisión en este texto es nuestro y no de ellos. Un excelente ejemplo de su sabiduría es la acertada observación: "¡Esa frase no sabe si va o viene!".

Primera edición: Yves Eynard, Chet Ramey, William Shotts, Ryan Waldron y Michael Wang.

Segunda edición: Chet Ramey, Robert Day y Arnold Robbins.

O'Reilly

Gracias a todo el equipo de O'Reilly, sin el cual este libro no existiría por muchas razones, ¡y si existiera el contenido no sería ni parecería tan bueno!

Primera edición: nuestro editor Mike Loukides, Derek Di Matteo y Laurel Ruma.

Segunda edición: nuestro editor Jeff Bleiel, Rachel Head, Kristen Brown, James Fraleigh, Ellen Troutman-Zaig y Rebecca Demarest en producción, y Matthew Hacker y otras personas de Herramientas. Por diversas razones, la segunda edición ha requerido mucho trabajo minucioso: gracias a todos por ello. Estamos muy impresionados por vuestra dedicación a este proyecto, así como por vuestra atención al detalle.

De los autores

Carl

La escritura de un libro nunca es un esfuerzo solitario, aunque tiene sus momentos. Gracias a JP por trabajar en este proyecto conmigo en ambas ediciones durante muchos años. Nuestros talentos y horarios complementarios han hecho de éste un libro mejor de lo que yo podría haber conseguido sola. Gracias también a JP por sus grandes esfuerzos de administrador de sistemas para proporcionarnos cierta infraestructura. Gracias a Mike por escuchar nuestras propuestas para un libro de cocina bash, por empujarnos cuando nos atascábamos y por refrenarnos cuando nos volvíamos locos. Su orientación constante y su aportación técnica fueron muy apreciadas. Mi mujer, Cynthia, y mis hijos (¡ya mayores!) me han apoyado pacientemente a lo largo de este proceso, dándome ánimos y motivación, así como tiempo y espacio para trabajar. Se lo agradezco de todo corazón.

Pero más profundo que la tarea inmediata de este libro fue el trasfondo y la preparación. Estoy muy en deuda con el Dr. Ralph Bjork, que hizo posible que empezara a trabajar con Unix antes de que casi nadie hubiera oído hablar de él. Su visión, previsión y orientación me han reportado dividendos durante más tiempo del que jamás hubiera esperado.

Mi trabajo en este libro está dedicado a mis padres, Hank y Betty, que me han dado todo lo bueno que tenían que ofrecer: la vida misma, la fe cristiana, el amor, una educación excelente, un sentido de pertenencia y todas esas cosas buenas y sanas que uno espera transmitir a sus propios hijos. Nunca podré agradecérselo lo suficiente.

JP

Gracias a Cameron por escribir Learning the bash Shell, del que aprendí mucho y que fue mi principal referencia hasta que empecé este proyecto, y por aportar tanto material útil de él. Gracias a Carl por todo su trabajo: sin él, esto habría llevado cuatro veces más tiempo y sólo habría sido la mitad de bueno. Gracias a Mike por poner en marcha el proyecto, por mantenerlo en marcha y por traer a Carl a bordo. Y gracias tanto a Carl como a Mike por su paciencia con mis problemas vitales y de gestión del tiempo.

Este libro está dedicado a papá, a quien le encantaría. Siempre me decía que sólo hay dos decisiones importantes: lo que haces y con quién te casas. He conseguido dos de dos, así que supongo que lo estoy haciendo bastante bien. Así que esto también está dedicado a Karen, por su increíble apoyo, paciencia y comprensión durante este proceso más largo de lo esperado y sin la cual ni siquiera los ordenadores serían tan divertidos. Por último, gracias a Kate y Sam, que han contribuido en gran medida a mis ya mencionados problemas de gestión de la vida.

Get Libro de cocina bash, 2ª edición now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.