Capítulo 1. Empezando con bash
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
¿Qué es un caparazón y por qué debería importarte?
Cualquier sistema operativo informático reciente (por reciente, entendemos desde 1970 aproximadamente) tiene algún tipo de interfaz de usuario: alguna forma de especificar comandos para que el sistema operativo los ejecute. Pero en muchos sistemas operativos, esa interfaz de comandos estaba realmente incorporada y sólo había una forma de hablar con el ordenador. Además, la interfaz de comandos de un sistema operativo te permitía ejecutar comandos, pero eso era todo. Después de todo, ¿qué más había que hacer?
El sistema operativo Unix popularizó la noción de separar el shell (la parte del sistema que te permite escribir comandos) de todo lo demás: el sistema de entrada/salida, el programador, la gestión de la memoria y todas las demás cosas de las que el sistema operativo se ocupa por ti (y de las que la mayoría de los usuarios no quieren preocuparse). El shell era un programa más; era un programa cuyo trabajo consistía en ejecutar otros programas en nombre de los usuarios.
Pero aquello fue el principio de una revolución. El shell era un programa más que se ejecutaba en Unix; si no te gustaba el estándar, podías crear el tuyo propio. Así que, al final de la primera década de Unix, había al menos dos intérpretes de comandos competidores: el intérprete de comandos Bourne, sh (que era descendiente del intérprete de comandos Thompson original), más el intérprete de comandos C, csh. A finales de la segunda década de Unix, había algunas alternativas más: el intérprete de comandos Korn, ksh, y las primeras versiones del intérprete de comandos bash. Al final de la tercera década de Unix, había probablemente una docena de shells diferentes.
Probablemente no te sientas a pensar: "¿Debería usar csh o bash o ksh hoy?". Probablemente estés contento con el shell estándar que venía con tu sistema Linux (o BSD o macOS o Solaris o HP/UX). Pero desvincular el intérprete de comandos del propio sistema operativo facilitó mucho a los desarrolladores de software (como Brian Fox, creador de bash, y Chet Ramey, actual desarrollador y mantenedor) escribir mejores intérpretes de comandos: podías crear un nuevo intérprete de comandos sin modificar el propio sistema operativo. Era mucho más fácil conseguir que se aceptara un nuevo intérprete de órdenes, ya que no tenías que convencer a ningún vendedor de sistemas operativos para que incorporara el intérprete de órdenes en su sistema; todo lo que tenías que hacer era empaquetar el intérprete de órdenes para que se pudiera instalar como cualquier otro programa.
Aun así, puede que estés pensando que eso suena a mucho alboroto para algo que sólo recibe órdenes y las ejecuta. Y tendrías razón: unintérprete de comandos que sólo te permitiera escribir órdenes no sería muy interesante. Sin embargo, dos factores impulsaron la evolución del shell de Unix: la comodidad del usuario y la programación. Y el resultado es un shell moderno que hace mucho más que limitarse a aceptar órdenes.
Los shells modernos son muy prácticos. Por ejemplo, recuerdan los comandos que has escrito y te permiten reutilizarlos. Las shells modernas también te permiten editar esos comandos, para que no tengan que ser siempre los mismos. Y las shells modernas te permiten definir tus propias abreviaturas de comandos, atajos y otras características. Para un usuario experimentado, teclear comandos (por ejemplo, con abreviaturas, atajos y completado de comandos) es mucho más eficiente y eficaz que arrastrar cosas por una elegante interfaz con ventanas.
Pero más allá de la simple comodidad, los shells son programables. Hay muchas secuencias de comandos que tecleas una y otra vez. Siempre que hagas algo por segunda vez, deberías preguntarte: "¿No puedo escribir un programa que haga esto por mí?". Pues puedes. Un shell también es un lenguaje de programación especialmente diseñado para trabajar con los comandos de tu sistema informático. Así, si quieres generar mil archivos MP3 a partir de archivos WAV, puedes escribir un programa shell (o shell script). Si quieres comprimir todos los archivos de registro de tu sistema, puedes escribir un script de shell para hacerlo. Siempre que te encuentres haciendo una tarea repetidamente, deberías intentar automatizarla escribiendo un script de shell. Hay lenguajes de programación más potentes, como Perl, Python y Ruby, pero el shell de Unix (sea cual sea el tipo de shell que utilices) es un buen punto de partida. Al fin y al cabo, ya sabes cómo escribir comandos; ¿para qué complicar las cosas?
1.1 ¿Por qué bash?
¿Por qué este libro trata de bash y no de otro shell? Porque bash está en todas partes. Puede que no sea el más nuevo, y posiblemente no sea el más elegante ni el más potente (aunque si no, se le acerca), ni tampoco es el único intérprete de comandos que se distribuye como software de código abierto, pero es omnipresente.
La razón tiene que ver con la historia. Los primeros shells eran herramientas de programación bastante buenas, pero no muy cómodas para los usuarios. El intérprete de comandos C añadía muchas comodidades para el usuario (como la posibilidad de repetir un comando que acababas de escribir), pero como lenguaje de programación era peculiar. El intérprete de comandos Korn, que apareció después (a principios de los 80), añadía muchas comodidades para el usuario, mejoraba el lenguaje de programación y parecía estar en vías de adopción generalizada. Pero ksh no era software de código abierto al principio; era un producto de software propietario y, por tanto, era difícil distribuirlo con un sistema operativo libre como Linux. (La licencia del shell Korn se modificó en 2000, y de nuevo en 2005).
A finales de los 80, la comunidad Unix decidió que la normalización era algo bueno, y se formaron los grupos de trabajo POSIX (organizados por el IEEE). POSIX estandarizó las bibliotecas y utilidades de Unix, incluido el shell. El intérprete de comandos estándar se basaba principalmente en la versión de 1988 del intérprete de comandos Korn, con algunas características del intérprete de comandos C y un poco de invención para rellenar los huecos. bash se inició como parte del esfuerzo del Proyecto GNU para producir un sistema POSIX completo, que naturalmente necesitaba un intérprete de comandos POSIX.
bash proporcionaba las funciones de programación que necesitaban los programadores de shell, además de las comodidades que gustaban a los usuarios de la línea de comandos. Originalmente se concibió como una alternativa al intérprete de comandos Korn, pero a medida que el movimiento del software libre cobró importancia y Linux se hizo más popular, bash eclipsó rápidamente a ksh.
Como resultado, bash es el intérprete de comandos de usuario por defecto en todas las distribuciones de Linux que conocemos (hay unos cientos de distribuciones de Linux, así que probablemente haya algunas con algún intérprete de comandos por defecto raro), así como en macOS (y en las versiones anteriores de OS X). También está disponible para casi todos los demás sistemas operativos Unix, incluidos BSD Unix y Solaris. En los raros casos en que bash no viene con el sistema operativo, es fácil de instalar. Incluso está disponible para Windows, a través de Cygwin y también para el nuevo subsistema Linux (Ubuntu). bash es tanto un potente lenguaje de programación como una buena interfaz de usuario, y no te encontrarás sacrificando atajos de teclado para conseguir elaboradas funciones de programación.
Es imposible que te equivoques aprendiendo bash. Los shells por defecto más comunes son el antiguo shell Bourne y bash, que en su mayor parte es compatible con el shell Bourne. Sin duda, uno de estos intérpretes de comandos está presente en cualquier sistema operativo Unix o similar a Unix moderno e importante. Y, como ya se ha dicho, si bash no está presente, siempre puedes instalarlo. Pero hay otros shells. En el espíritu del software libre, los autores y mantenedores de todas estas shells comparten ideas. Si lees los registros de cambios de bash, verás muchos lugares en los que se ha introducido una función o se ha modificado para adaptarla al comportamiento de otro intérprete de comandos. Pero a la mayoría de la gente no le importará. Utilizarán lo que ya existe y estarán contentos con ello. Así que, si te interesa, no dudes en investigar otros shells. Hay muchas alternativas buenas, y puede que encuentres una que te guste más, aunque probablemente no sea tan omnipresente como bash.
1.2 La Shell bash
bash es un shell: un intérprete de comandos. El objetivo principal de bash (o de cualquier shell) es permitirte interactuar con el sistema operativo del ordenador para que puedas realizar lo que necesites. Normalmente eso implica ejecutar programas, por lo que el intérprete de comandos toma las órdenes que escribes, determina a partir de esa entrada qué programas deben ejecutarse y los ejecuta por ti. También te encontrarás con tareas que implican una secuencia de acciones a realizar que son recurrentes, o muy complicadas, o ambas cosas. La programación del shell, normalmente denominada shell scripting, te permite automatizar estas tareas para facilitar su uso, fiabilidad y reproducibilidad.
Por si eres nuevo en bash, empezaremos por lo básico. Si has utilizado Unix o Linux alguna vez, probablemente no seas nuevo en bash, peropuede que no supieras que lo estabas utilizando. bash es en realidad un lenguaje para ejecutar comandos, de modo que los comandos que has estado escribiendo todo el tiempo (por ejemplo, ls, cd, grep, cat) son, en cierto sentido, comandos de bash. Algunos de estos comandos están integrados en el propio bash; otros son programas independientes. Por ahora, no importa cuáles son cuáles.
Terminaremos este capítulo con algunas recetas para conseguir bash. La mayoría de los sistemas vienen con bash preinstalado, pero algunos no. Incluso si tu sistema viene con bash, siempre es una buena idea saber cómo obtenerlo e instalarlo: de vez en cuando se publican nuevas versiones con nuevas funciones.
Si ya estás ejecutando bash y estás algo familiarizado con él, quizá quieras ir directamente al Capítulo 2. No es probable que leas este libro en orden, y si te sumerges en la mitad, encontrarás algunas recetas que demuestran de lo que bash es realmente capaz. Pero primero, lo básico.
1.3 Descodificar la pregunta
Solución
Todas las shells de línea de comandos tienen algún tipo de prompt para avisarte de que la shell está lista para aceptar tu entrada. El aspecto del indicador depende de muchos factores, como el tipo y la versión de tu sistema operativo, el tipo y la versión del intérprete de comandos, la distribución y cómo lo haya configurado otra persona. En la familia de intérpretes de comandos Bourne, un $
al final de la línea de comandos significa generalmente que has iniciado sesión como usuario normal, mientras que un #
al final significa que eres root. La cuenta root es el administrador del sistema, equivalente a la cuenta Sistema en Windows (que es incluso más poderosa que la cuenta Administrador ). root es todopoderoso y puede hacer cualquier cosa en un sistema Unix o Linux típico.
Los avisos por defecto también suelen mostrar la ruta al directorio en el que te encuentras; sin embargo, suelen abreviarlo, de modo que un ~
significa que estás en tu directorio personal. Algunos avisos por defecto también pueden mostrar tu nombre de usuario y el nombre de la máquina en la que has iniciado sesión. Si ahora te parece una tontería, no lo será cuando estés conectado a cinco máquinas a la vez, posiblemente con nombres de usuario diferentes.
Este es un prompt típico de Linux para un usuario llamado jp en una máquina llamada adams, en el directorio home. El final $
indica que se trata de un usuario normal, no de root:
jp@adams:~$
Este es el mensaje después de cambiar al directorio /tmp. Observa cómo ~
, que en realidad significaba /home/jp, ha cambiado a /tmp:
jp@adams:/tmp$
Debate
El prompt del shell es lo que verás más a menudo cuando trabajes en la línea de comandos, y hay muchas formas de personalizarlo más a tu gusto. Pero por ahora, basta con saber interpretarlo. Por supuesto, tu prompt por defecto puede ser diferente, pero deberías ser capaz de averiguar lo suficiente para arreglártelas por ahora.
Hay algunos sistemas Unix o Linux en los que el poder de root puede ser compartido, mediante comandos como su y sudo. O puede que root ni siquiera sea todopoderoso, si el sistema ejecuta algún tipo de sistema de control de acceso obligatorio (MAC) como el SELinux de la NSA.
1.4 Mostrar dónde estás
Solución
Utiliza el comando integrado pwd, o establece en un indicador más útil (como se describe en la Receta 16.2). Por ejemplo:
bash-4.3$ pwd /tmp bash-4.3$ export PS1='[\u@\h \w]$ ' [jp@solaris8 /tmp]$
Debate
pwd significa imprimir directorio de trabajo y tiene dos opciones. -L
muestra tu ruta lógica y es la predeterminada. -P
muestra tu ubicación física,, que puede diferir de tu ruta lógica si has seguido un enlace simbólico. Del mismo modo, el comando cd también proporciona los modificadores -P
y -L
:
bash-4.3$ pwd /tmp/dir2 bash-4.3$ pwd -L /tmp/dir2 bash-4.3$ pwd -P /tmp/dir1
Ver también
1.5 Encontrar y ejecutar comandos
Solución
Prueba los comandos type, which, apropos, locate, slocate, find y ls.
Debate
bash guarda una lista de directorios en los que debe buscar comandos en una variable de entorno llamada PATH
. El comando bash builtin type busca en tu entorno (incluidos alias, palabras clave, funciones, builtins, directorios en $PATH
, y la tabla hash de comandos) comandos ejecutables que coincidan con sus argumentos y muestra el tipo y la ubicación de las coincidencias. Tiene varias opciones, entre las que destaca la bandera -a
, que hace que imprima todas las coincidencias en lugar de detenerse en la primera. El comando which es similar, pero sólo busca en tu $PATH
(y alias csh ). Puede variar de un sistema a otro (suele ser un script de shell csh en BSD, pero un binario en Linux), y suele tener una bandera -a
como type. Utiliza estos comandos cuando conozcas el nombre de un comando y necesites saber exactamente dónde se encuentra, o para ver si está en este ordenador. Por ejemplo:
$ type which which is hashed (/usr/bin/which) $ type ls ls is aliased to `ls -F -h' $ type -a ls ls is aliased to `ls -F -h' ls is /bin/ls $ which which /usr/bin/which
Casi todos los comandos vienen con algún tipo de ayuda sobre cómo utilizarlos. Suele haber documentación en línea llamada páginas man, donde "man" es la abreviatura de manual. Se accede a ellas mediante el comando man, por lo que te dará documentación sobre el comando man ls
ls. Muchos programas también tienen una ayuda integrada, a la que se accede proporcionando un argumento "ayúdame" como o . Algunos programas, especialmente en otros sistemas operativos, te darán ayuda si no les das argumentos. Algunos comandos de Unix también lo harán, pero muchos no. Esto se debe a la forma en que los comandos Unix encajan entre sí en algo llamado -h
--help
"pipelines", que veremos más adelante. Pero, ¿y si no sabes o no recuerdas el nombre del comando que necesitas? apropos busca en los nombres y descripciones de las páginas de manual las expresiones regulares suministradas como argumentos. Esto es increíblemente útil cuando no recuerdas el nombre del comando que necesitas. Es lo mismo que : man -k
$ apropos music cms (4) - Creative Music System device driver $ man -k music cms (4) - Creative Music System device driver
locate y slocate consultan los archivos de la base de datos sobre el sistema (normalmente compilados y actualizados por una tarea ejecutada desde el sistema programador cron) para encontrar archivos o comandos casi instantáneamente. La ubicación de los archivos reales de la base de datos, lo que se indexa en ellos y la frecuencia con la que se comprueba puede variar de un sistema a otro. Consulta las páginas de manual de tu sistema para más detalles. slocate (locate seguro) almacena información sobre permisos (además de nombres de archivos y rutas) para que no liste programas a los que el usuario no tenga acceso. En la mayoría de los sistemas Linux, locate es un enlace simbólico a slocate; otros sistemas pueden tener programas separados, o no tener slocate en absoluto. Aquí tienes un ejemplo:
$ locate apropos /usr/bin/apropos /usr/share/man/de/man1/apropos.1.gz /usr/share/man/es/man1/apropos.1.gz /usr/share/man/it/man1/apropos.1.gz /usr/share/man/ja/man1/apropos.1.gz /usr/share/man/man1/apropos.1.gz
Para más detalles sobre el comando encontrar, consulta el Capítulo 9.
Por último, pero no menos importante, prueba a utilizar ls. Recuerda que si el comando que quieres ejecutar está en tu directorio actual, debes anteponerle el prefijo ./
, ya que el directorio de trabajo actual no suele estar en tu $PATH
por motivos de seguridad (véanse las Recetas 14.3 y 14.10).
Ver también
-
help type
-
man which
-
man apropos
-
man locate
-
man slocate
-
man find
-
man ls
1.6 Obtener información sobre los archivos
Solución
Utiliza los comandos ls, stat, file o find:
$ touch /tmp/sample_file $ ls /tmp/sample_file /tmp/sample_file $ ls -l /tmp/sample_file -rw-r--r-- 1 jp jp 0 Dec 18 15:03 /tmp/sample_file $ stat /tmp/sample_file File: "/tmp/sample_file" Size: 0 Blocks: 0 IO Block: 4096 Regular File Device: 303h/771d Inode: 2310201 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 501/ jp) Gid: ( 501/ jp) Access: Sun Dec 18 15:03:35 2005 Modify: Sun Dec 18 15:03:35 2005 Change: Sun Dec 18 15:03:42 2005 $ file /tmp/sample_file /tmp/sample_file: empty $ file -b /tmp/sample_file empty $ echo '#!/bin/bash -' > /tmp/sample_file $ file /tmp/sample_file /tmp/sample_file: Bourne-Again shell script text executable $ file -b /tmp/sample_file Bourne-Again shell script text executable
Para saber más sobre el comando encontrar, consulta el Capítulo 9.
Debate
El comando ls
sólo muestra los nombres de los archivos, mientras que -l
proporciona más detalles sobre cada archivo. ls tiene muchas opciones; consulta la página de manual de tu sistema para conocer las que admite. Algunas opciones útiles son:
-a
-
No ocultes los archivos que empiecen por . (punto).
-A
-
Como
-a
, pero se salta los dos directorios comunes . (punto) y .. (punto punto), ya que están presentes en prácticamente todos los directorios. -F
-
Muestra el tipo de archivo con uno de los varios designadores de tipo que aparecen al final.
Una barra (
/
) indica que el archivo es un directorio, un asterisco (*
) significa que el archivo es ejecutable, una arroba (@
) indica un enlace simbólico, un signo igual (=
) es un socket, y una tubería o barra vertical (|
) es un búfer FIFO (primero en entrar, primero en salir). -l
-
Utiliza el formato de listado largo.
-L
-
Muestra información sobre el archivo enlazado, en lugar del propio enlace simbólico.
-Q
-
Nombres de cita (extensión GNU, no admitida en todos los sistemas).
-r
-
Invierte el orden de clasificación.
-R
-
Recorre los subdirectorios.
-S
-
Ordenar por tamaño de archivo.
-1
-
Utiliza el formato corto, pero con un solo archivo por línea.
stat, file y find tienen muchas opciones que controlan el formato de salida; consulta las páginas de manual de tu sistema para ver las opciones compatibles. Por ejemplo, estas opciones producen una salida similar a ls -l
:
$ ls -l /tmp/sample_file -rw-r--r-- 1 jp jp 14 Dec 18 15:04 /tmp/sample_file $ stat -c'%A %h %U %G %s %y %n' /tmp/sample_file -rw-r--r-- 1 jp jp 14 Sun Dec 18 15:04:12 2005 /tmp/sample_file $ find /tmp/ -name sample_file -printf '%m %n %u %g %t %p' 644 1 jp jp Sun Dec 18 15:04:12 2005 /tmp/sample_file
No todos los sistemas operativos y versiones disponen de todas estas herramientas. Por ejemplo, Solaris no incluye stat por defecto.
También vale la pena señalar que los directorios no son más que archivos que el sistema operativo sabe que debe tratar de forma especial, por lo que los comandos que se muestran aquí funcionarán perfectamente en directorios, aunque a veces puede que tengas que modificar un comando para obtener el comportamiento que deseas. Por ejemplo, utiliza ls -d
para listar información sobre el propio directorio, en lugar de sólo ls
(que lista el contenido del directorio).
Ver también
-
man ls
-
man stat
-
man file
-
man find
1.8 Utilizar las Citas Shell
Debate
El texto no entrecomillado, e incluso el que va entre comillas dobles, está sujeto a la expansión y sustitución del intérprete de comandos. Tenlo en cuenta:
$ echo A coffee is $5?! A coffee is ?! $ echo "A coffee is $5?!" -bash: !": event not found $ echo 'A coffee is $5?!' A coffee is $5?!
En el primer ejemplo, $5
se trata como una variable a expandir, pero como no existe se establece como nula. En el segundo ejemplo, ocurre lo mismo, pero ni siquiera llegamos allí porque !
se trata como una sustitución del historial, que falla en este caso porque no coincide con nada del historial. El tercer ejemplo funciona como se esperaba.
Para mezclar algunas expansiones del intérprete de comandos con algunas cadenas literales, puedes utilizar el carácter de escape del intérprete de comandos \
o cambiar el entrecomillado. El signo de exclamación es un caso especial porque el carácter de escape de barra invertida que lo precede no se elimina. Puedes evitarlo utilizando comillas simples o un espacio al final, como se muestra aquí:
$ echo 'A coffee is $5 for' "$USER" '?!' A coffee is $5 for jp ?! $ echo "A coffee is \$5 for $USER?\!" A coffee is $5 for jp?\! $ echo "A coffee is \$5 for $USER?! " A coffee is $5 for jp?!
Además, no puedes incrustar una comilla simple dentro de comillas simples, aunque utilices una barra invertida, ya que nada (ni siquiera la barra invertida) se interpola dentro de las comillas simples. Pero puedes solucionarlo utilizando comillas dobles con escapes, o escapando una comilla simple fuera de las comillas simples que la rodean.
# We'll get a continuation prompt since we now have unbalanced quotes $ echo '$USER won't pay $5 for coffee.' > ^C # WRONG $ echo "$USER won't pay $5 for coffee." jp won't pay for coffee. # Works $ echo "$USER won't pay \$5 for coffee." jp won't pay $5 for coffee. # Also works $ echo 'I won'\''t pay $5 for coffee.' I won't pay $5 for coffee.
Ver también
-
Enel capítulo 5 encontrarás más información sobre las variables del shell y la sintaxis
$VAR
-
Enel capítulo 18 encontrarás más información sobre ! y los comandos de historial
1.9 Utilizar o reemplazar Builtins y Comandos Externos
Problema
Quieres sustituir un comando incorporado por tu propia función o comando externo, y necesitas saber exactamente qué está ejecutando tu script (por ejemplo, /bin/echo o el comando incorporado echo). O has creado un nuevo comando y puede entrar en conflicto con un comando externo o incorporado existente.
Solución
Utiliza el tipo y los comandos para ver si existe un comando determinado y si está incorporado o es externo:
$ type cd cd is a shell builtin $ type awk awk is /usr/bin/awk $ which cd /usr/bin/which: no cd in (/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/ \ local/sbin:/usr/bin/X11:/usr/X11R6/bin:/root/bin) $ which awk /usr/bin/awk
Debate
Un comando incorporado es precisamente eso; está incorporado en el propio shell, mientras que un comando externo es un archivo externo lanzado por el shell. El archivo externo puede ser un binario, o puede ser un script del propio shell, y es importante entender la diferencia por un par de razones. En primer lugar, cuando utilices una versión determinada de un shell concreto, los programas integrados siempre estarán disponibles, pero los programas externos pueden estar instalados o no en un sistema concreto. En segundo lugar, si le das a uno de tus propios programas el mismo nombre que a un builtin, los resultados serán muy confusos, ya que el builtin siempre tendrá preferencia (ver Receta 19.4). Es posible utilizar el comando enable para activar y desactivar los comandos de los builtins, aunque te recomendamos encarecidamente que no lo hagas a menos que estés absolutamente seguro de que entiendes lo que estás haciendo. enable -a
listará todos los builtins y su estado de activación o desactivación.
Uno de los problemas de los comandos integrados es que generalmente no puedes utilizar las opciones -h
o --help
para obtener recordatorios de uso, y si existe una página de manual, a menudo es sólo un puntero a la gran página de manual de bash. Ahí es donde resulta útil el comando help, que a su vez es un comando incorporado, . help muestra ayuda sobre los comandos incorporados al shell:
help: help [-dms] [pattern ...] Display information about builtin commands. Displays brief summaries of builtin commands. If PATTERN is specified, gives detailed help on all commands matching PATTERN, otherwise the list of help topics is printed. Options: -d output short description for each topic -m display usage in pseudo-manpage format -s output only a short usage synopsis for each topic matching PATTERN Arguments: PATTERN Pattern specifying a help topic Exit Status: Returns success unless PATTERN is not found or an invalid option is given.
Cuando necesites redefinir un builtin, utiliza el comando builtin para evitar bucles. Por ejemplo, podemos definir una función shell (ver Receta 10.4) para cambiar cómo funciona el comando cd:
cd () { builtin cd "$@" echo "$OLDPWD --> $PWD" }
Para forzar el uso de un comando externo en lugar de cualquier función o builtin que de otro modo tendría precedencia, utiliza enable -n
, que desactiva los builtins del shell, o command, que ignora las funciones del shell. Por ejemplo, para utilizar la prueba que se encuentra en $PATH
en lugar de la versión del shell builtin, escribe enable -n test
y luego ejecuta test
. O utiliza command ls
para utilizar el comando ls nativo en lugar de cualquier función ls que hayas creado.
Ver también
-
man which
-
help help
-
help builtin
-
help command
-
help enable
-
help type
1.10 Determinar si estás ejecutando interactivamente
Solución
Utiliza la declaración case
del Ejemplo 1-1.
Ejemplo 1-1. ch01/interactivo
#!/usr/bin/env bash
# cookbook filename: interactive
case
"
$-
"
in *i*)
# Code for interactive shell here
;;
*)
# Code for noninteractive shell here
;;
esac
Debate
$-
es un listado de todas las opciones actuales del intérprete de comandos. Contendrá i
si el intérprete de comandos es interactivo.
También puedes ver código como el siguiente (funcionará, pero la solución del Ejemplo 1-1 es el método preferido):
if
[
-n"
$PS1
"
]
;
then
echo
This shell is interactiveelse
echo
This shell is not interactivefi
Ver también
-
help case
-
help set
-
Enla receta 6.14, "Bifurcarse de muchas maneras", encontrarás más explicaciones sobre la sentencia
case
1.11 Establecer bash como tu shell por defecto
Solución
En primer lugar, asegúrate de que bash está instalado. Prueba a escribir bash --version
en la línea de comandos. Si aparece una versión, es que está instalado:
$ bash --version GNU bash, version 3.00.16(1)-release (i386-pc-solaris2.10) Copyright (C) 2004 Free Software Foundation, Inc. $
Si no ves un número de versión, puede que te falte un directorio en tu ruta. chsh -l
o cat /etc/shells
pueden darte una lista de shells válidos en algunos sistemas. Si no, pregunta al administrador de tu sistema dónde está bash, o si se puede instalar.
chsh -l
proporciona una lista de shells válidos en Linux, pero abre un editor y te permite cambiar la configuración en BSD. -l
no es una opción válida para chsh en macOS, pero simplemente ejecutando chsh se abrirá un editor que te permitirá cambiar la configuración, y chpass -s
shell
cambiará tu shell.
Si bash está instalado, utiliza el comando chsh -s
para cambiar tu shell por defecto: por ejemplo, chsh -s /bin/bash
. Si por alguna razón eso falla, prueba con chsh
, passwd -e
, passwd -l
, chpass
, o usermod -s /usr/bin/bash
. Si sigues sin poder cambiar tu shell, pregunta a tu administrador del sistema, que puede que tenga que editar el archivo /etc/passwd. En la mayoría de los sistemas, /etc/passwd tendrá líneas de la forma:
cam:pK1Z9BCJbzCrBNrkjRUdUiTtFOh/:501:100:Cameron Newham:/home/cam:/bin/bash cc:kfDKDjfkeDJKJySFgJFWErrElpe/:502:100:Cheshire Cat:/home/cc:/bin/bash
Como root, sólo tienes que editar el último campo de las líneas del archivo de contraseñas con el nombre completo de la ruta del shell que elijas. Si tu sistema tiene un comando vipw, deberías utilizarlo para garantizar la coherencia del archivo de contraseñas.
Debate
Algunos sistemas operativos, especialmente los Unix BSD, suelen colocar bash en la partición /usr. Puede que quieras pensártelo dos veces antes de cambiar el shell de rooten tales sistemas. Si el sistema tiene problemas al arrancar y tienes que trabajar en él antes de que se monte /usr, tienes un verdadero problema: no hay un intérprete de órdenes que pueda utilizar root. Por lo tanto, lo mejor es no cambiar el shell por defecto para root. Sin embargo, no hay razón para no hacer que bash sea el shell por defecto para las cuentas de usuario normales. Y ni que decir tiene que es una mala práctica utilizar la cuenta root a menos que sea absolutamente necesario. Utiliza tu cuenta normal (de usuario) siempre que sea posible. Con comandos como sudo, rara vez necesitarás un intérprete de comandos root.
Si todo lo demás falla, probablemente puedas sustituir tu shell de inicio de sesión actual por bash utilizando exec, pero esto no es para los débiles de corazón. Consulta "A7) ¿Cómo puedo hacer que bash sea mi shell de inicio de sesión?" en las FAQ debash.
Ver también
-
man chsh
-
man passwd
-
man chpass
-
/etc/shells
-
"A7) ¿Cómo puedo hacer que bash sea mi shell de inicio de sesión?" de ftp://ftp.cwru.edu/pub/bash/FAQ
1.12 Mantener bash actualizado
Solución
Mantener actualizado todo tu sistema está fuera del alcance de este libro; consulta al administrador de tu sistema y la documentación.
Cómo mantengas actualizado bash depende de cómo lo hayas obtenido en primer lugar. En el caso ideal, forma parte del sistema en general y se actualiza cuando se actualiza el sistema. Puede que no sea así si utilizas un sistema muy antiguo que ya no recibe soporte, en cuyo caso tendrás que actualizarlo todo. Si estás utilizando tu sistema de paquetes y el repositorio de origen aún se mantiene activamente, deberías obtener las actualizaciones de allí; por ejemplo, de Extra Packages for Enterprise Linux (EPEL) o de un Archivo Personal de Paquetes (PPA) de Ubuntu.
Si instalaste desde el código fuente, dependerá de ti actualizarlo y reconstruirlo como corresponda.
Ver también
1.13 Obtener bash para Linux
Solución
bash está incluido en prácticamente todas las distribuciones modernas de Linux. Para asegurarte de que tienes la última versión disponible para tu distribución, utiliza las herramientas de empaquetado integradas en la distribución. Debes ser root o tener sudo o la contraseña de root para actualizar o instalar aplicaciones.
Algunas distribuciones de Linux (sobre todo la familia Debian) utilizan el shell Debian Almquist, o dash,como /bin/sh porque es más pequeño y, por tanto, se ejecuta un poco más rápido que bash. Ese cambio causó mucha confusión cuando los scripts asumían que /bin/sh era realmente bash, ya que los scripts que utilizaban funciones de bash con #!/bin/sh
fallaban. Consulta la Receta 15.3 para más detalles.
Para Debian y sistemas derivados de Debian como Ubuntu y Linux Mint, utiliza una de las diversas herramientas de interfaz gráfica de usuario (GUI) o una herramienta de línea de comandos como apt-get, aptitude o apt para asegurarte de que está instalado y actualizado:
apt-get update && apt-get install bash bash-completion bash-doc
Para las distribuciones Red Hat , incluidas Fedora, Community OS (CentOS) y Red Hat Enterprise Linux (RHEL), utiliza la herramienta GUI Añadir/Quitar aplicaciones. Sólo para la línea de comandos, utiliza
yum update bash
Para SUSE, utiliza la versión GUI o terminal de YaST. También puedes utilizar la herramienta rpm de la línea de comandos.
Debate
Es imposible abarcar todas las distribuciones de Linux y difícil incluso abarcar las principales, ya que todas evolucionan rápidamente. Afortunadamente, gran parte de esa evolución se produce en el ámbito de la facilidad de uso, por lo que no debería ser muy difícil averiguar cómo instalar software en la distribución que elijas.
Al utilizar LiveCDs, lo más probable es que las actualizaciones e instalaciones de software fallen debido al soporte de sólo lectura. Las versiones de dichas distribuciones que se hayan instalado en un disco duro deben poder actualizarse.
Si en te preguntas qué versión de bash está disponible en una determinada distribución de Linux, busca la distribución en DistroWatch.com y consulta la tabla de paquetes. Por ejemplo, https://distrowatch.com/table.php?distribution=mint muestra lo que ves en la Tabla 1-1.
Paquete | 18 sarah | 17,3 rosa | 16 petra | 15 olivia | 14 nadia | 13 maya | 12 lisa | 11 katya | 10 julia | ... |
---|---|---|---|---|---|---|---|---|---|---|
bash (4.4) |
4.3 |
4.3 |
4.2 |
4.2 |
4.2 |
4.2 |
4.2 |
4.2 |
4.1 |
... |
Ver también
-
Debian: http://www.debian.org/doc/
-
guión: https://en.wikipedia.org/wiki/Almquist_shell y https://wiki.ubuntu.com/DashAsBinSh
-
Red Hat Enterprise Linux: http://red.ht/2uWkEs0
-
OpenSuSE: https://doc.opensuse.org/
1.14 Obtener bash para xBSD
Solución
Según la página debash de Chet Ramey:
Bash-4.3 está incluido en la colección de ports de FreeBSD, en la colección de paquetes de OpenBSD y en la colección de paquetes de NetBSD.
Para ver si bash está instalado, comprueba el archivo /etc/shells. Para instalar o actualizar bash, utiliza el comando pkg_add. Si eres un usuario experimentado de BSD, puede que prefieras utilizar la colección de ports, pero no lo trataremos aquí.
Si te preguntas qué versión de bash está disponible en una determinada distribución BSD, busca la distribución en DistroWatch.com y consulta la tabla de paquetes. Por ejemplo
Para FreeBSD, utiliza el comando:
pkg_add -vr bash
Para NetBSD, navega hasta Software de aplicación para NetBSD y localiza el último paquete bash para tu versión y arquitectura, luego utiliza un comando como:
pkg_add -vu ftp://ftp.netbsd.org/pub/NetBSD/packages/pkgsrc-2005Q3/NetBSD-2.0/ \ i386/All/bash-3.0pl16nb3.tgz
Para OpenBSD, utiliza el comando pkg_add -vr
. Puede que tengas que ajustar la ruta FTP a tu versión y arquitectura. Además, puede que exista una versión compilada estáticamente. Por ejemplo:
pkg_add -vr ftp://ftp.openbsd.org/pub/OpenBSD/3.8/packages/i386/bash-3.0.16p1.tgz
Debate
FreeBSD y OpenBSD colocan bash en /usr/local/bin/bash, mientras que NetBSD utiliza /usr/pkg/ bin/bash.
1.15 Obtener bash para macOS
Solución
Según la página debash de Chet Ramey:
Las versiones actuales de Mac OS X [ahora llamado macOS] (que datan de Jaguar/Mac OS X 10.2) incluyen bash-3.2 como /bin/sh. También hay paquetes precompilados para OS X de bash-4.3 disponibles en muchos sitios web, aunque los paquetes fuente suelen estar más actualizados. Bash para Darwin (la base para MacOS X) está disponible en MacPorts, Homebrew o Fink.
Debate
También es posible crear una versión más reciente de bash a partir del código fuente, pero esto sólo se recomienda a los usuarios experimentados (consulta el Apéndice E).
1.16 Obtener bash para Unix
Solución
Si aún no está instalado o no está en el repositorio de programas de tu sistema operativo, consulta la página bash de Chet Ramey para descargar binarios, o constrúyelo desde el código fuente (consulta el Apéndice E).
Debate
Según la página debash de Chet Ramey:
El proyecto OpenPKG pone a disposición RPMs fuente de bash-4.3 para diversos sistemas Unix y Linux como parte esencial de la versión actual.
Los usuarios de Solaris 2.x, Solaris 7/8/9/10/11 pueden obtener una versión precompilada de bash-4.3 en el sitio Unixpackages (suscripción) o en OpenCSW. Oracle distribuye bash-3.2 como parte compatible de Solaris 10 y bash-4.1 como parte de Solaris 11. La versión de Solaris/Illumos distribuida como OpenIndiana incluye bash-4.3 desde septiembre de 2016.
Los usuarios de AIX pueden obtener versiones precompiladas de bash-4.3 y versiones anteriores para varias versiones de AIX en Groupe Bull, y fuentes y binarios de bash-4.3 para varias versiones de AIX en perzl.org. IBM ofrece bash-4.2 y bash-4.3 para AIX 5L, AIX 6.1 y AIX 7.1 como parte de la caja de herramientas AIX para aplicaciones GNU/Linux. Utilizan el formato RPM; también puedes conseguir RPM para AIX desde allí.
Los usuarios de HP-UX pueden obtener los binarios y el código fuente de bash-4.3 en el Centro de Portabilidad y Archivo de Software para HP-UX.
Ver también
-
https://tiswww.case.edu/php/chet/bash/bashtop.html#Distributions
-
Solaris
-
AIX
-
http://www.bullfreeware.com/, y fuentes y binarios de bash-4.3 para varias versiones de AIX de:
-
-
HP-UX
1.17 Obtener bash para Windows
Solución
Utiliza Cygwin o Ubuntu en Windows, o una máquina virtual. O no utilices bash.
Descarga Cygwin y ejecútalo. Sigue las instrucciones y elige los paquetes a instalar, incluido bash, que se encuentra en la categoría shells y está seleccionado por defecto. Una vez instalado Cygwin, tendrás que configurarlo. Consulta la Guía del Usuario para más detalles.
Para Ubuntu en Windows necesitas una versión de Windows 10 del verano de 2016 o posterior; entonces sigue las instrucciones de instalación, detalladas en la Discusión.
Para utilizar una máquina virtual, consulta la Receta 15.4.
Por último, aunque odiemos decirlo, quizá la solución correcta sea utilizar herramientas nativas como PowerShell.
Debate
Cygwin
Cygwin es un entorno similar a Linux para Windows que proporciona un aspecto y una sensación de Linux.
Del sitio de Cygwin:
Cygwin lo es:
una gran colección de herramientas GNU y de Código Abierto que proporcionan una funcionalidad similar a la de una distribución Linux en Windows.
una DLL (cygwin1.dll) que proporciona una funcionalidad sustancial de la API POSIX.
Cygwin no lo es:
una forma de ejecutar aplicaciones nativas de Linux en Windows. Debes reconstruir tu aplicación desde el código fuente si quieres que funcione en Windows.
una forma de hacer que las aplicaciones nativas de Windows conozcan mágicamente la funcionalidad de UNIX®, como señales, ptys, etc. De nuevo, tienes que crear tus aplicaciones desde el código fuente si quieres aprovechar la funcionalidad de Cygwin.
La DLL de Cygwin funciona actualmente con todas las versiones x86 de 32 y 64 bits recientes y comercializadas de Windows, empezando por Windows Vista.
Nota
La anterior versión 2.5.2 de Cygwin fue la última compatible con Windows XP y Server 2003.
Cygwin es un verdadero entorno tipo Unix que se ejecuta sobre Windows. Es una herramienta excelente, pero a veces puede resultar excesiva. Para obtener los binarios nativos de Windows de las utilidades GNU Text (sin incluir bash), consulta http://unxutils.sourceforge.net/.
Ubuntu en Windows
Ejecutar Ubuntu en Windows es muy interesante, pero aparte de que incluye bash está fuera del alcance de este libro, así que no lo trataremos en detalle. Para más detalles, consulta las referencias que aparecen en la sección Ver también.
Brevemente:
-
Activa el Modo Desarrollador (consulta http://bit.ly/2h21MSZ).
-
Busca "Características de Windows".
-
Elige "Activar o desactivar las características de Windows" y activa "Subsistema de Windows para Linux".
-
¡¡¡Esto probablemente requiere un reinicio!!! En serio!?!
-
-
-
Abre el símbolo del sistema y escribe
bash
.-
Descarga el Subsistema de Windows para Linux de la tienda de Windows.
-
Utilizando PowerShell u otras herramientas nativas
PowerShell es la respuesta de Microsoft a la potencia y flexibilidad de las herramientas de línea de comandos y el sustituto de los archivos por lotes command.com y cmd.exe. Aparte del hecho de que es la respuesta nativa de Windows al shell scripting, está fuera del alcance de este libro, por lo que no lo trataremos.
Aunque palidecen en comparación con cualquiera de las herramientas de Unix/Linux, los antiguos lenguajes de script de shell eran más potentes de lo que mucha gente sabía. Pueden ser apropiados para tareas muy sencillas en las que cualquiera de las otras soluciones comentadas aquí resulten exageradas. Consulta http://www.jpsdomain.org/windows/winshell.html para más detalles.
Para obtener potentes shells de línea de comandos basados en caracteres y GUI con una interfaz más consistente pero con sabor a DOS/Windows, consulta http://jpsoft.com. Ninguno de los autores está afiliado a esta empresa, pero uno de ellos es un usuario satisfecho desde hace mucho tiempo.
Ver también
-
Ubuntu en Windows:
-
"Microsoft y Canonical se asocian para llevar Ubuntu a Windows 10" por Steven Vaughan-Nichols
-
"Ubuntu en Windows-El espacio de usuario de Ubuntu para desarrolladores de Windows" por Dustin Kirkland
-
"Los desarrolladores pueden ejecutar Bash Shell y binarios de Ubuntu Linux en modo usuario en Windows 10" por Scott Hanselman
-
"Anuncio de Windows 10 Insider Preview Build 14316" por Gabe Aul
-
"El proyecto alwsl te permite instalar Arch Linux en el subsistema Windows para Linux " por Marius Nestor
-
"Cómo instalar y utilizar la shell Bash de Linux en Windows 10" por Chris Hoffman
1.18 Obtener bash sin obtener bash
Solución
Consigue una cuenta shell gratuita casi en http://polarhome.com, que tiene una pequeña y simbólica cuota única, o en otro proveedor.
Como casi todas las distribuciones Linux y BSD tienen una imagen LiveCD o LiveDVD, que casi seguro que también puede utilizarse como LiveUSB, puedes descargarlas y arrancarlas para experimentar. También es una buena idea si estás pensando en cambiar, para poder verificar que todo tu hardware es compatible y funciona. La parte complicada puede ser conseguir que la BIOS o UEFI de tu sistema arranque desde el CD/DVD o USB. Solía ser complicado "grabar" una ISO en una memoria USB, pero ahora hay muchas herramientas e instrucciones detalladas en la web para la distribución que elijas.
Como alternativa, puedes utilizar una solución de virtualización; consulta la Receta 15.4.
Debate
Polarhome ofrece muchos servicios gratuitos y cuentas shell casi gratuitas. Según el sitio web:
polarhome.com es un esfuerzo educativo no comercial para la popularización de los sistemas operativos con shell y los servicios de Internet, que ofrece cuentas de shell, el entorno de desarrollo, correo y otros servicios en línea en todos los sistemas disponibles (actualmente en diferentes sabores de Linux, MacOS X, OpenVMS, Solaris, OpenIndiana, AIX, QNX, IRIX, HP-UX, Tru64, SCO OpenServer, UnixWare, FreeBSD, OpenBSD, NetBSD, DragonFly/BSD, MirBSD, Ultrix, Minix, GNU Hurd, Syllable y OPENSTEP).
Ver también
-
Lista de cuentas shell gratuitas: http://shells.red-pill.eu
1.19 Aprender más sobre la documentación de bash
Solución
Bueno, estás leyendo este libro, ¡que es un buen punto de partida! Los otros libros de O'Reilly sobre bash y shell scripting son Learning the bash Shell, 3ª Edición, de Cameron Newham y Classic Shell Scripting de Nelson H. F. Beebe y Arnold Robbins.
Por desgracia, no toda la documentación oficial de bash ni los archivos de soporte son fácilmente accesibles en línea. El Manual de Referencia de Bash está disponible en el sitio web del Proyecto GNU, pero gran parte del resto del material es más difícil de encontrar o de acceder. Nuestro sitio web complementario ha hecho todo el trabajo por ti y proporciona la documentación de referencia oficial de bash y otro material útil en línea para que sea fácil consultarlo. Compruébalo, y remite a otros a él cuando sea necesario.
Documentación oficial
La FAQ oficial de bash está en ftp://ftp.cwru.edu/pub/bash/FAQ. Consulta especialmente "H2) ¿Qué tipo de documentación sobre bash existe?". También se recomienda encarecidamente la guía de referencia oficial; más adelante encontrarás más detalles.
La página de bash de Chet Ramey contiene un montón de información muy útil. Chet (el actual mantenedor de bash ) también mantiene lo siguiente:
- LÉEME
-
Un archivo que describe bash
- NOTICIAS
-
Un archivo que enumere escuetamente los cambios notables entre la versión actual y la anterior.
- CAMBIOS
-
Un historial completo de cambios en bash
- INSTALAR
-
Instrucciones de instalación
- NOTAS
-
Notas de configuración y funcionamiento específicas de la plataforma
- COMPAT
-
Lista de problemas de compatibilidad entre bash3 y bash1
El último código fuente de bash y la documentación están siempre disponibles en http://ftp.gnu.org/gnu/bash/.
Te recomendamos encarecidamente que descargues tanto el código fuente como la documentación, aunque utilices binarios preempaquetados (en el Apéndice B encontrarás un índice de los ejemplos y el código fuente incluidos). Aquí tienes una breve lista de la documentación incluida en el directorio ./doc del tarball fuente (por ejemplo, para http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz/, bash-4.4/doc):
- PREGUNTAS FRECUENTES
-
Un conjunto de preguntas frecuentes sobre bash con respuestas
- INTRO
-
Breve introducción a bash
- artículo.ms
-
Un artículo que Chet escribió sobre bash para The Linux Journal
- bash.1
-
La página man de bash
- bashbug.1
-
La página man de bashbug
- builtins.1
-
Una página de manual que documenta los builtins extraídos de bash.1
- bashref.texi
-
El manual de referencia de Bash
- bashref.info
-
El Manual de Referencia Bash procesado por makeinfo
- rbash.1
-
La página restringida del shell bash
- línea de lectura.3
-
La página man de readline
Los archivos .ps son versiones PostScript de los archivos enumerados aquí. Los archivos .html son versiones HTML de la página de manual y del manual de referencia. Los archivos .0 son páginas de manual formateadas. Las versiones .txt son ASCII, la salida de groff -Tascii
.
En el tarball de documentos (por ejemplo, http://ftp.gnu.org/gnu/bash/bash-doc-4.4.tar.gz), encontrarás versiones formateadas de:
bash-doc-4.4:
- bash.0
-
La página de manual de bash (también .pdf, .ps, .html)
- bashbug.0
-
La página man de bashbug
- bashref
-
El Manual de Referencia GNU Bash (también .pdf, .ps, .html, .dvi)
- builtins.0
-
La página man de builtins
- rbash.0
-
La página restringida del shell bash
Otra documentación
-
"Guía avanzada de Bash-Scripting" de Mendel Cooper
-
Programación BASH - Introducción CÓMO" de Mike G
-
Guía Bash para principiantes" de Machtelt Garrels
-
Bash Prompt HOWTO" de Giles Orr
-
Muy antiguo, pero aún útil: "Diferencias del shell UNIX y cómo cambiar tu shell"
-
El "Manual de Shell Scripting" de Apple
Ver también
-
Aprender el shell bash, 3ª edición, por Cameron Newham (O'Reilly)
-
Shell Scripting clásico por Nelson H. F. Beebe y Arnold Robbins (O'Reilly)
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.