El Shell es el programa que permite al usuario comunicarse con el kernel de Linux.
Existen muchos shell, aunque el que se va a ver es el sell denominado “Bash”, por ser uno de los más extendidos.
El shell Bash tiene una serie de opciones que definen su comportamiento. podemos ver estas opciones con el comando set -o. Para activar una opción hacemos set -o [opción]. Para desactivarla set +o [opción].
Algunas de las opciones más interesantes son:
Para definir una variable (no se especifica el tipo de cada variable), se utiliza la sintaxis [nombre_de_la_variable]=[valor], sin dejar ningún espacio. Ejemplos:
var1=12 var2=palabra var3='dos palabras' var4=$'algunos car. especiales; $* ?{}()[]"\\&#' var5=
Las variables se ponen por convención en minúscula, ya que se dejan las mayúsculas para las variables de entorno. Las variables están compuestas por letras, números y el carácter de barra baja. Sólo pueden empezar por una letra o barra baja.
Se puede ver el valor de una variable con el comando echo.
var1=12 echo La variable var1 es $var1
Para referirse a una variable se antepone '$' al nombre de la variable.
Con el comando set podemos ver un listado de las variables en ese proceso (además de un montón más de cosas). Con el comando unset e indicando a continuación el nombre de la variable, eliminamos dicha variable.
Una variable sólo existe en el shell en el que se haya creado. Al salir de éste, las variables son automáticamente eliminadas.
Con el comando bash abrimos un shell que es un proceso hijo del shell en el que nos encontrábamos. De esta manera las variables son locales a cada shell. Para cerrar el “shell hijo” y volver al “shell padre”, lo cerramos con exit.
Para que las variables del padre sean conocidas por el hijo, usamos el comando export:
export x=3 bash echo $x 3 x=7 y=2 export y echo $y 2 exit echo $x 3 echo $y
Con export, las variables creadas en el proceso padre pasan al hijo, pero nunca a la inversa.
Las variables de entorno se escriben por convención en mayúsculas. Estas variables son definidas al cargar la shell y afectan al comportamiento del mismo. Pueden verse todas (junto a muchas otras cosas) con el comando set. Puede verse su contenido con el comando echo. Algunas más importantes son:
En el bash, a la hora de especificar nombres de archivo, comandos, etc. es posible usar algunos caracteres denominados genéricos, para especificar cadenas de texto que desconocemos.
Todos estos caracteres genéricos pueden usarse en conjunto para realizar búsquedas más complejas. Por ejemplo: {*ro[sj]*,?a*} puede dar como resultado: banco, rosado o rojo.
Es posible indicar entre paréntesis y separados por |, diferentes patrones de búsqueda, de forma que se puede indicar con un carácter delante del paréntesis las condiciones de correspondencia que se deben cumplir:
Para usar esta característica, debe activarse la opciónextglob des shell, con el comando shopt.
Cuando queremos pasar caracteres especiales como caracteres normales, sin que el shell los interprete con su funcionalidad especial, usamos los caracteres de cita:
Un descriptor de archivo es un puntero que apunta a un archivo.Cuando un programa lee o escribe en un archivo, utiliza un descriptor de archivo para para efectuar las operaciones.
Cualquier proceso en linux tiene tres descriptores de archivo, que se identifican con un número:
Si se desea enviar la entrada desde un archivo se utiliza el operador de redirección <. Por ejemplo:
wc < /etc/passwd
Para redireccionar la salida a un archivo, se utiliza el carácter >. Por ejemplo:
echo > archivoTest
Para redireccionar el error se utiliza 2> para redirigir a un archivo los mensajes de error.
Hay que tener en cuenta que cuando redirigimos las salidas a un archivo con los operadores de redirección, se sobreescribe el contenido. Para evitarlo simplemente se añade otro operador: « o ».
También pueden combinarse todos los tipos de redirecciones de entrada, salida y error de forma simultánea, ejecutándolos siempre de izquierda a derecha. Ejemplo:
comando < archivoEntrada > archivoSalida > archivoError
Por último indicar que nunca se deben redirigir dos descriptores de archivo diferentes al mismo archivo, ya que esto provocaría resultados inesperados. La solución es usar la sintaxis [número descriptor]>&[número descriptor al que enviar los datos]. Ejemplo en el que no hay ningún archivo llamado “naranja”:
ls azul verde naranja rojo > archOut 2>&1 cat archOut ls: naranja No such file or directory azul rojo verde
Ahora hemos visto como se podía enviar la salida de un proceso a un archivo. Las tuberías conectan procesos, de forma que la salida de un proceso va a la entrada de otro proceso. Las tuberías se indican con el carácter barra vertical |.
Ejemplo:
ls | wc -l
Puede usarse el comando tee como comando intermedio para consultar el resultado de un comando que a su vez será entrada de otro. Ejemplo:
ls | tee /tmp/lista | wc -l
Un alias reemplaza un comando, generalmente complejo, por un literal.
Pueden verse los alias existentes con el comando alias sin argumentos.
Para definir un alias se usa la sintaxis alias [nombreAlias]='[comando]'.
Para suprimir un alias se utiliza el comando unalias [nombreAlias].
Si un alias tiene un nombre igual al de un comando, siempre se ejecutará el alias, salvo que se especifique \[nombreAlias] o usar el comando command.
Se puede suprimir todos los alias con el comando unalias -a.
Existen dos tipos de comandos en Linux:
Puede conocerse el tipo de comando con type. Para localizar la ubicación de un comando se usa whereis.