Aprendiendo_Korn_Shell/Secciones/Prefacio.tex

229 lines
27 KiB
TeX

La larga y tortuosa historia del sistema operativo Unix ha dado lugar a sistemas con todo tipo de permutaciones y combinaciones de características. Esto significa que cada vez que te acercas a un sistema Unix desconocido, necesitas averiguar ciertas cosas sobre él para poder utilizarlo correctamente. E incluso en un sistema dado, puedes tener un número de opciones que puedes hacer sobre las características que quieres usar.
La decisión más importante, si es que la tienes que tomar, es qué shell usar. <<Shell>> es la jerga de Unix para el programa que le permite comunicarse con el ordenador introduciendo comandos y obteniendo respuestas. El shell está completamente separado del sistema operativo Unix per se; es sólo un programa que se ejecuta en Unix. En otros sistemas como MS-DOS, Microsoft Windows, Macintosh,\footnote{Al menos hasta MacOS X. MacOS X tiene un sistema similar a Unix en su núcleo: Darwin, que deriva de Mach y 4.4-BSD-Lite.} OpenVMS y VM/CMS, el intérprete de comandos o la interfaz de usuario es una parte integral del sistema operativo.
Hoy en día hay docenas de shells diferentes flotando por ahí, que van desde el estándar original, el shell de Bourne, hasta interfaces basadas en menús y gráficas. Los shells más importantes han sido el shell de Bourne, el shell C y el shell de Korn, el tema de este libro.
\subsection*{Versiones de Korn Shell}
En concreto, este libro describe la versión de 1993 del shell de Korn. La versión de 1993 se distribuye con las tres principales versiones comerciales de Unix: Solaris, HP-UX y AIX, aunque como parte del Entorno Común de Escritorio (CDE), en \texttt{/usr/dt/bin/dtksh}. La versión de 1988 también está disponible en los sistemas Unix modernos, normalmente como \texttt{/usr/bin/ksh}. Existen otras versiones, variaciones e implementaciones en otros sistemas operativos; éstas, junto con las diferencias entre las versiones de 1988 y 1993 del shell de Korn se describen en \hyperref[sec:ApendiceA]{Apéndice A}.
La versión de 1993 está ahora disponible tanto en forma de código fuente como de ejecutables precompilados para muchos sistemas comunes. En \hyperref[sec:ApendiceC]{Apéndice C} se describe la descarga y construcción de la misma. La última versión descargable de \emph{ksh} tiene una serie de características que no estaban en las versiones anteriores. También cubrimos todas esas características. Hemos hecho un esfuerzo para señalar cuando algo puede no estar en una versión anterior, pero caveat emptor; si necesita una característica y la versión de su sistema del shell de Korn 1993 no la tiene, puede necesitar descargar un ejecutable precompilado o descargar el código fuente y construir su propio ejecutable.
Para saber qué versión tienes, escribe el comando \emph{set -o emacs}, y luego pulsa CTRL-V. Deberías ver una fecha seguida de la letra de la versión (la letra no suele ser importante). Si es así, tienes una de las versiones oficiales, la de 1993, la de 1988 o una más antigua. Pero si no es así, tiene una versión no estándar, como pdksh, el shell de Korn de dominio público que se discute en el \hyperref[sec:ApendiceA]{Apéndice A}.
\subsection*{Resumen de las características del Shell de Korn}
El shell de Korn es el más avanzado de los shells que se distribuyen <<oficialmente>> con los sistemas Unix. Se trata de un sucesor evolutivo del shell Bourne, compatible con las versiones anteriores, que incluye la mayoría de las principales ventajas del shell C, así como una serie de nuevas características propias.
Entre las características apropiadas del intérprete de comandos C se incluyen:
\begin{description}
\item[Control de trabajo:] La capacidad de detener trabajos con CTRL-Z y moverlos al primer plano o al fondo con los comandos \emph{fg} y \emph{bg}.
\item[Alias:] La capacidad de definir nombres abreviados para comandos o líneas de comando.
\item[Funciones:] La capacidad de almacenar su propio código de shell en la memoria en lugar de archivos. Las funciones aumentan la programabilidad y la eficiencia. (Las funciones han sido comunes en el shell Bourne durante muchos años).
\item[Historial de comandos:] La capacidad de recordar comandos introducidos previamente. \\
\end{description}
Las principales características nuevas del Shell de Korn incluyen:
\begin{description}
\item[Edición de línea de comandos:] Esta característica le permite usar comandos de edición de estilo \emph{vi} o \emph{Emacs} en sus líneas de comando.
\item[Funciones de programación integradas:] La funcionalidad de varios comandos externos de Unix, incluidos \emph{test , expr , getopt} y \emph{echo}, se ha integrado en el propio shell, lo que permite que las tareas de programación comunes se realicen de manera más limpia y sin crear procesos adicionales.
\item[Estructuras de Control:] Las estructuras adicionales de control de flujo, especialmente la construcción de selección , permiten una fácil generación de menús.
\item[Primitivos de depuración:] Estas características hacen posible escribir herramientas que ayuden a los programadores a depurar su código de shell.
\item[Expresiones regulares:] Bien conocidas por los usuarios de utilidades de Unix como \emph{grep} y \emph{awk}, las expresiones regulares (aunque con una sintaxis diferente) se han agregado al conjunto estándar de comodines de nombre de archivo y a la función de variable de shell.
\item[Funciones de E/S avanzadas:] Varias instalaciones nuevas para el control de E/S de procesos, incluida la capacidad de realizar una comunicación bidireccional con procesos concurrentes (corrutinas) y conectarse a servicios de red.
\item[Nuevas opciones y variables:] Estas opciones y variables le brindan más formas de personalizar su entorno que los shells estándar de Unix.
\item[Mayor velocidad:] El shell de Korn a menudo ejecuta el mismo programa de shell considerablemente más rápido que el shell de Bourne.
\item[Características de seguridad:] Funciones diseñadas para ayudar a proteger contra <<caballos de Troya>> y otros tipos de esquemas de robo. \\
\end{description}
Las principales características nuevas de la versión de 1993 incluyen:
\begin{description}
\item[Conformidad con POSIX:] El cumplimiento de POSIX, un estándar internacional para la programación de shell portátil, hace posible escribir y utilizar scripts de shell portátiles.
\item[Aritmética para bucles:] Esta nueva estructura de control le permite programar de forma más natural cuando se repite un número fijo de veces.
\item[Aritmética de punto flotante:] La capacidad de usar números de coma flotante y las nuevas funciones aritméticas integradas enriquecen el shell como lenguaje de programación.
\item[Nombres de variables estructuradas:] La nueva sintaxis para los nombres de variables proporciona funciones similares a las estructuras C y los registros Ada para agrupar elementos relacionados en una variable.
\item[Referencias a variables indirectas:] Esta facilidad facilita la programación de funciones de shell para manipular variables globales.
\item[matrices asociativas:] Una potente función de gestión de datos que es similar a las de \emph{awk} o \emph{perl}.
\item[Facilidades adicionales de manipulación de texto:] Incluso hay más formas de hacer coincidir patrones y sustituir variables.
\item[Más comandos integrados:] Los comandos adicionales mejoran la eficiencia y aumentan la portabilidad de los scripts.
\end{description}
\subsection*{Público Objetivo}
Este libro está diseñado para atraer a los usuarios ocasionales de Unix que están por encima del nivel de <<principiante>>. Deberías estar familiarizado con el proceso de iniciar sesión, introducir comandos y hacer cosas sencillas con los archivos. Aunque el \hyperref[sec:Chapter1]{Capítulo 1} repasa conceptos como el esquema de archivos y directorios en forma de árbol, puede que te parezca que avanza demasiado rápido si eres un completo neófito. En ese caso, le recomendamos el libro \emph{Learning the Unix Operating System}, de Jerry Peek, Grace Todino y John Strang, publicado por O'Reilly \& Associates, Inc.
Si eres un usuario experimentado, puedes saltarte el \hyperref[sec:Chapter1]{Capítulo 1}. Pero si su experiencia es con el shell C, puede encontrar que el \hyperref[sec:Chapter1]{Capítulo 1} revela algunas diferencias sutiles entre los shells Korn y C.
No importa cuál sea su nivel de experiencia, indudablemente aprenderá muchas cosas en este libro que le harán un usuario más productivo del shell de Korn -- desde las características más importantes hasta los detalles a nivel de <<novato>> de los que no era consciente.
Si está interesado en la programación del shell (escribiendo scripts y funciones del shell que automatizan las tareas cotidianas o sirven como utilidades del sistema), también debería encontrar este libro útil. Sin embargo, hemos evitado deliberadamente hacer una fuerte distinción entre el uso interactivo del shell (introducir comandos durante una sesión de inicio de sesión) y la programación del shell. Consideramos que la programación del shell es una consecuencia natural e inevitable del aumento de la experiencia como usuario.
En consecuencia, cada capítulo depende de los anteriores, y aunque los tres primeros capítulos están orientados únicamente al uso interactivo, los siguientes describen características interactivas orientadas al usuario además de conceptos de programación.
De hecho, si este libro tiene un mensaje primordial, es éste: <<El shell de Korn es un entorno de programación Unix increíblemente potente y muy infravalorado. Usted -sí, usted- puede escribir programas de shell útiles, incluso si acaba de aprender a conectarse la semana pasada y nunca ha programado antes>>.
Con este fin, hemos decidido no dedicar mucho tiempo a las características que interesan exclusivamente a los programadores de sistemas de bajo nivel. Conceptos como descriptores de archivos, tipos de archivos especiales, etc., sólo pueden confundir al usuario casual, y de todos modos, pensamos que aquellos de ustedes que entienden esas cosas son lo suficientemente inteligentes como para extrapolar la información necesaria de nuestras discusiones superficiales.
\subsection*{Ejemplos de Código}
Este libro está lleno de ejemplos de comandos y programas del shell que están diseñados para ser útiles en tu vida diaria como usuario, no sólo para ilustrar la función que se explica. A partir del \hyperref[sec:Chapter4]{Capítulo 4}, incluimos varios problemas de programación, que llamamos tareas, que ilustran conceptos particulares de programación del shell. Algunas tareas tienen soluciones que se perfeccionan en capítulos posteriores. Los capítulos posteriores también incluyen ejercicios de programación, muchos de los cuales se basan en las tareas del capítulo.
Puedes usar cualquier código que veas en este libro y pasarlo a tus amigos y colegas. Le animamos especialmente a que lo modifique y mejore usted mismo. El código está disponible en el sitio web de este libro: \url {http://www.oreilly.com/catalog/korn2/}.
Si desea probar ejemplos pero no usa el shell de Korn como su shell de inicio de sesión, debe colocar la siguiente línea en la parte superior de cada script de shell:
\begin{lstlisting}[language=bash]
#!/bin/ksh
\end{lstlisting}
Si su shell de Korn no está instalado como el archivo \emph{/bin/ksh}, o si \emph{/bin/ksh} es la versión de 1988, sustituya el nombre de ruta completo por su versión de \emph{ksh93} en lo anterior.
\subsection*{Resumen del Capítulo}
Si desea investigar temas específicos en lugar de leer todo el libro, aquí hay un resumen capítulo por capítulo:
\begin{enumerate}
\item \hyperref[sec:Chapter1]{Capítulo 1} \\
Presenta el shell de Korn y le indica cómo instalarlo como su shell de inicio de sesión. Luego presenta los conceptos básicos del uso de shell interactivo, incluidas las descripciones generales del esquema de archivos y directorios de Unix, E/S estándar y trabajos en segundo plano.
\item \hyperref[sec:Chapter2]{Capítulo 2} \\
Describe el mecanismo de historial de comandos del shell, incluidos los modos de edición de emacs y vi y el comando \emph{hist} history.
\item \hyperref[sec:Chapter3]{Capítulo 3} \\
Cubre formas de personalizar su entorno de shell sin programación, mediante el uso de los archivos \emph{.profile} y de entorno. Los alias, las opciones y las variables de shell son las técnicas de personalización discutidas.
\item \hyperref[sec:Chapter4]{Capítulo 4} \\
Introduce la programación de shell. Este capítulo explica los conceptos básicos de las funciones y los scripts de shell, y analiza varias funciones de programación importantes: operadores de manipulación de cadenas, expresiones regulares, argumentos de línea de comandos (parámetros posicionales) y sustitución de comandos.
\item \hyperref[sec:Chapter5]{Capítulo 5} \\
Continúa la discusión de la programación del shell describiendo el estado de salida del comando, las expresiones condicionales y las estructuras de control de flujo del shell: \emph{if , for , case , select , while} y \emph{till}.
\item \hyperref[sec:Chapter6]{Capítulo 6} \\
Profundiza en los parámetros posicionales y el procesamiento de opciones de la línea de comandos, luego analiza los tipos especiales y las propiedades de las variables, como la aritmética de enteros y de coma flotante, la versión aritmética del bucle \emph{for}, las matrices indexadas y asociativas y el comando \emph{typeset}.
\item \hyperref[sec:Chapter7]{Capítulo 7} \\
Proporciona una descripción detallada de la E/S del shell de Korn, completando la información omitida en el Capítulo 1 . Todos los redirectores de E/S del shell están cubiertos, junto con la capacidad del shell para realizar conexiones de socket TCP/IP y los comandos de E/S de línea a la vez \emph{read , print} e \emph{printf}. Luego, el capítulo analiza el mecanismo de procesamiento de la línea de comandos del shell y el comando \emph{eval}.
\item \hyperref[sec:Chapter8]{Capítulo 8} \\
Cubre los problemas relacionados con el proceso en detalle. Comienza con una discusión sobre el control del trabajo y luego pasa a información de bajo nivel sobre los procesos, incluidos los ID de procesos, las señales y las trampas. Luego, el capítulo pasa a un nivel más alto de abstracción para analizar corrutinas, conductos bidireccionales y subcapas.
\item \hyperref[sec:Chapter9]{Capítulo 9} \\
Describe varias técnicas de depuración, comenzando con las simples como los modos de rastreo y detallado y las trampas de <<señal falsa>>. A continuación, este capítulo describe las funciones de disciplina. Finalmente, presenta \emph{kshdb}, una herramienta de depuración de shell de Korn que puede usar para depurar su propio código.
\item \hyperref[sec:Chapter10]{Capítulo 10} \\
Brinda información para administradores de sistemas, incluidas técnicas para implementar la personalización de shell en todo el sistema, personalizar los editores integrados y funciones relacionadas con la seguridad del sistema.
\item \hyperref[sec:ApendiceA]{Apéndice A} \\
Compara el shell de Korn de 1993 con varios shells similares, incluido el shell SVR4 Bourne estándar, el shell de Korn de 1988, el shell estándar IEEE 1003.2 POSIX, el shell CDE Desk Top Korn (\emph{dtksh}), \emph{tksh} (que combina Tcl/Tk con \emph{ksh} ), el shell de Korn de dominio público (|emph{pdksh}), el |emph{bash} de la Free Software Foundation , el shell Z (|emph{zsh}) y varios shells de estilo Bourne (realmente entornos de emulación de Unix) para Microsoft Windows.
\item \hyperref[sec:ApendiceB]{Apéndice B} \\
Contiene listas de opciones de invocación de shell, comandos integrados, alias predefinidos, variables integradas, operadores de prueba condicional, opciones de \emph{comando de configuración, opciones de comando de composición tipográfica} y comandos de modo de edición de emacs y vi. Este apéndice también cubre los detalles completos para usar el comando integrado \emph{getopts}.
\item \hyperref[sec:ApendiceC]{Apéndice C} \\
Describe cómo descargar el código fuente de \emph{ksh93} y crear un ejecutable que funcione. Este apéndice también cubre la descarga de ejecutables preconstruidos para varios sistemas diferentes.
\item \hyperref[sec:ApendiceD]{Apéndice D} \\
Presenta los términos de licencia para el código fuente \emph{ksh93}.
\end{enumerate}
\subsection*{Convenciones Utilizadas en este Manual}
Dejamos entendido que, cuando se introduce un comando del shell, se pulsa ENTER al final. ENTER está etiquetado como RETURN en algunos teclados.
Los caracteres llamados CTRL-X, donde X es cualquier letra, se introducen manteniendo pulsada la tecla CTRL (o CTL, o CONTROL) y pulsando esa letra. Aunque demos la letra en mayúscula, se puede pulsar la letra sin la tecla SHIFT.
Otros caracteres especiales son la nueva línea (que es lo mismo que CTRL-J), RETROCESO (lo mismo que CTRL-H), ESC, TAB y DEL (a veces etiquetado como DELETE o RUBOUT).
Este libro utiliza las siguientes convenciones tipográficas:
\begin{itemize}
\item \emph{Cursiva} \\
Se utiliza cuando se habla de nombres de archivos Unix, comandos externos e incorporados, nombres de alias, opciones de comandos, opciones del shell y funciones del shell. La cursiva también se utiliza en el texto cuando se discuten parámetros ficticios que deben ser reemplazados por un valor real, para distinguir los programas vi y emacs de sus modos Korn-shell, y para resaltar términos especiales la primera vez que se definen.
\item \texttt{Anchura constante} \\
Se utiliza para los nombres de las variables y las palabras clave del shell, los sufijos de los nombres de archivo y en los ejemplos para mostrar el contenido de los archivos o la salida de los comandos, así como para las líneas de comando cuando están dentro de un texto normal.
\item \textbf{\texttt{Negrita de ancho constante}} \\
Se utiliza en los ejemplos para mostrar la interacción entre el usuario y el shell; cualquier texto que el usuario escriba se muestra en \textbf{negrita de ancho constante}. Por ejemplo:
\begin{lstlisting}[language=bash, escapeinside={(*}{*)}]]
$ (* \textbf{pwd} *)
/home/billr/ora/kb
$
\end{lstlisting}
\item \emph{\texttt{Cursiva de ancho constante}} \\
Se utiliza en el texto y en las líneas de comando de ejemplo para los parámetros ficticios que deben sustituirse por un valor real. Por ejemplo:
\begin{lstlisting}[language=bash, escapeinside={(*}{*)}]]
$ (* \textbf{cd} \emph{directorio} *)
\end{lstlisting}
\item \emph{Vídeo inverso} \\
Se utiliza en el \hyperref[sec:Chapter2]{Capítulo 2} para mostrar la posición del cursor en la línea de comandos que se está editando. Por ejemplo:
\begin{lstlisting}[language=bash, escapeinside={(*}{*)}]]
grep -l Bob < ~pete/wk/(*\highlight{n}*)ombres
\end{lstlisting}
\item \textbf{NOTA} Indica un consejo, sugerencia o nota general.
\item \textbf{ADVERTENCIA} Indica una advertencia o precaución. \\
\end{itemize}
Los comandos de utilidad estándar de Unix se mencionan a veces con un número entre paréntesis (normalmente 1) después del nombre del comando. El número se refiere a la sección del Manual del Usuario de Unix en la que encontrará la documentación de referencia (también conocida como <<la página man>>) sobre la utilidad en cuestión. Por ejemplo, \emph{grep}(1) significa la página del manual para \emph{grep} en la Sección 1.
Cuando hay una diferencia importante entre las versiones de 1988 y 1993 del shell de Korn, nos referimos a ellas como \emph{ksh88} y \emph{ksh93} respectivamente. La mayor parte de este libro se aplica a todas las versiones del shell de Korn de 1993. Cuando necesitemos distinguir entre diferentes versiones del shell de Korn de 1993, añadiremos la versión menor al nombre, como \emph{ksh93h}, o \emph{ksh93l+}.
\subsection*{Acerca de la Segunda Edición}
La primera edición de este libro cubría la versión de 1988 del shell de Korn. Poco después de su publicación, David Korn lanzó la versión de 1993, que incluía compatibilidad con el estándar de shell POSIX 1003.2, así como muchas nuevas características.
Aunque \emph{ksh93} ha tardado en difundirse en el mundo comercial de Unix, el código fuente está ahora disponible, por lo que cualquiera que quiera una copia de la última y mejor versión de \emph{ksh93} no tiene más que descargar el código fuente y compilarlo. Teniendo esto en cuenta, hemos hecho de \emph{ksh93} el centro de la segunda edición, con un resumen de las diferencias disponible en un apéndice. Esta edición cubre la versión más reciente de \emph{ksh93} disponible en el momento de escribir este artículo, que incluye algunas características significativas que no se encuentran en las versiones anteriores.
La estructura básica y el flujo del libro siguen siendo los mismos, aunque hemos corregido varios errores y erratas de la primera edición y hemos actualizado kshdb, el depurador de Korn Shell, para que funcione con \emph{ksh93}. El \hyperref[sec:ApendiceA]{Apéndice A} incluye ahora más información sobre los programas similares al shell de Korn, tanto para sistemas Unix como Windows.
También se incluye en esta edición una tarjeta de referencia que cubre muchas de las características de \emph{ksh93} descritas en este libro. Esta tarjeta tiene el copyright de Specialized Systems Consultants, Inc. (SSC), y se reimprime con permiso. SSC vende una versión de la tarjeta en cuatro colores, 26 paneles, de 3,5 por 8,5 pulgadas, que cubre tanto \emph{ksh88} como \emph{ksh93} con mucho más detalle. Para más información, consulte \url{http://www.ssc.com}.
\subsection*{Nos Gustaría Saber de Usted}
Por favor, dirija sus comentarios y preguntas sobre este libro al editor:
\begin{spacing}{0}
\begin{scriptsize}
O'Reilly \& Associates, Inc. \\
1005 Gravenstein Highway North \\
Sebastopol, CA 95472 \\
(800) 998-9938 (en Estados Unidos o Canadá) \\
(707) 829-0515 (internacional o local) \\
(707) 829-0104 (fax) \\
\end{scriptsize}
\end{spacing}
\vspace{0.3cm}
Disponemos de una página web para este libro, en la que aparecen ejemplos, erratas o cualquier información adicional. Puede acceder a esta página en:
\url{http://www.oreilly.com/catalog/korn2/}
Para comentar o hacer preguntas técnicas sobre este libro, envíe un correo electrónico a:
bookquestions@oreilly.com
Para obtener más información sobre nuestros libros, conferencias, centros de recursos y la red O'Reilly, consulte nuestro sitio web en:
\url{http://www.oreilly.com}
\subsection*{Agradecimientos}
Escribir un libro desde cero no es fácil. Actualizar un libro es aún más difícil; el truco consiste en hacer imposible (o al menos difícil) que el lector sepa qué autor escribió cada parte. Espero haberlo conseguido. Quiero dar las gracias a Bill Rosenblatt por haber escrito la primera edición y haberme proporcionado un excelente material con el que trabajar. Es uno de los mejores libros de O'Reilly que he leído, y ha sido un placer trabajar con él.
Me gustaría dar las gracias (en orden alfabético) a Nelson A. Beebe (Departamento de Matemáticas de la Universidad de Utah), al Dr. David G. Korn (AT\&T Research), a Chet Ramey (mantenedor de bash), a Bill Rosenblatt (GiantSteps/Media Technology Strategies) y al Dr. Eugene H. Spafford (Departamento de Ciencias de la Computación de la Universidad de Purdue) por haber revisado el libro y haber aportado muchos comentarios útiles. Mike Loukides, el editor del libro, fue muy paciente conmigo durante varios retrasos en la actualización. David Chu, del equipo editorial de O'Reilly, hizo un gran trabajo asegurándose de que muchas de las partes <<tuercas y tornillos>> del proyecto se hicieran, por lo que estoy agradecido.
David Korn, ahora de AT\&T Research Laboratories, y autor del shell de Korn, respondió a varias preguntas y proporcionó acceso temprano a la documentación de ksh93l, lo que ayudó considerablemente, así como acceso previo a la liberación de ksh93n. Glenn Fowler, también de AT\&T Research, me ayudó con problemas de compilación bajo GNU/Linux, así como a entender algunos de los puntos más finos del uso de ksh. Steve Alston aportó algunas mejoras al depurador kshdb en el \hyperref[sec:Chapter9]{Capítulo 9}. George Kraft IV proporcionó información útil sobre dtksh para el \hyperref[sec:ApendiceA]{Apéndice A}. Glenn Barry, de Sun Microsystems, proporcionó información sobre zsh para el \hyperref[sec:ApendiceA]{Apéndice A}.
Gracias a Phil Hughes, presidente de SSC, por el permiso para reimprimir partes de su tarjeta de referencia de ksh.
Otros miembros del personal de O'Reilly también han contribuido al libro: Leanne Soylemez fue la editora de producción y correctora; Mary Brady y Jane Ellin proporcionaron un control de calidad adicional; Brenda Miller escribió el índice.
Por último, gracias a mi maravillosa esposa Miriam, por no reclamar la atención que le correspondía en demasiadas noches mientras trabajaba en este libro. Sin ella, no valdría la pena hacer nada.
\newpage
\begin{spacing}{0}
\begin{scriptsize}
Arnold Robbins \\
Nof Ayalon \\
ISRAEL \\
\end{scriptsize}
\end{spacing}
\vspace{0.3cm}
\subsection*{Agradecimientos de la Primera Edición}
Muchas personas han contribuido a este libro de muchas maneras. Me gustaría dar las gracias a las siguientes personas por su asesoramiento y asistencia técnica: por la ayuda en la administración del sistema, John van Vlaanderen y Alexis Rosen. Por la información sobre shells alternativas, John (de nuevo), Sean Wilson (de MKS), Ed Ravin, Mel Rappaport y Chet Ramey. Por identificar la necesidad de un depurador de shell, la experiencia en SunOS y la seguridad del sistema y, de hecho, una parte importante de mi carrera, Hal Stern. Por las sugerencias de depuración, Tan Bronson. Por la ayuda humanitaria, Jessica Lustig. Y muchas gracias a David Korn por todo tipo de información de <<boca de caballo>> - y, por supuesto, por el propio shell de Korn.
Gracias a nuestros revisores técnicos: Jim Baumbach, Jim Falk, David Korn, Ed Miner, Eric Pearce y Ed Ravin. Aprecio especialmente la cooperación de Ed y Ed (en ese orden) durante mi fase de <<¡¿Qué quieres decir con que no funciona?!>>.
Varias personas de O'Reilly \& Associates contribuyeron a este esfuerzo: Gigi Estabrook y Clairemarie Fisher O'Leary corrigieron múltiples borradores del manuscrito, Kismet McDonough y Donna Woonteiler corrigieron el manuscrito, Len Muellner implementó el macropaquete de diseño del libro, Jennifer Niederst diseñó la portada y el formato del libro, y Chris Reilley creó las figuras. Por último, un océano de gratitud para Mike Loukides: editor, motivador, facilitador, constructivo y constante voz de la razón. Él y el resto de la gente de O'Reilly \& Associates son algunas de las personas más innovadoras, interesantes y motivadas con las que he tenido el privilegio de trabajar.
--Bill Rosenblatt