LPIC 103.1 Work on the command line

Calentamos motores de nuevo, cogemos carrerilla y ya no pararemos hasta que terminemos con la segunda mitad del estudio del LPIC-1 que nos falta. Es la mitad a mi entender mas importante si la miramos desde el punto de vista de peso y por tanto de preguntas que caen en el examen de la certificacion, asi como desde el punto de vista de practicidad laboral de estas cosas que luego aprendemos. El tema de hoy en concreto creo que es clave uno de los mas importantes, si no el mas importante que todo buen sysadmin debe ser capaz de manejar y ademas hacerlo con soltura. Y sin mas rodeos, al lio!

Peso:

Este apartado tiene un peso de 4 sobre 4. El peso maximo, asi que haceros a la idea de que es importantisimo

Comandos y ficheros útiles

Introducción:

Se supone que gracias a este tema seremos capaces de interactual con shells y comandos usando tan solo la linea de comandos. Con esto se refiere no solo a un comando simple si no a comandos de una linea que sean en realidad la interaccion de varios comandos entre si, que es donde se demuestra la verdadera potencia de un sistema operativo linux. Tambien comprenderemos el funcionamiento de las variables del sistema y aprenderemos a cambiarlas para trabajar con ellas. Por ultimo aprenderemos a trabajar con el historial de comandos del sistema y el concepto de PATH y a trabajar con el.

Para poder hacer esto nos valdremos como ya he comentado de una shell, la cual nos mostrara un prompt indicandonos que esta lista para recibir comandos y nosotros los introduciremos por medio del teclado. Aunque la shell original de linux era sh en la actualidad la shell por defecto es bash. En el apartado de hoy aprenderemos pues los aspectos basicos de bash con los que deberiamos sentirnos totalmente comodos.

The interactive shell

La shell es un sistema muy potente que por medio de un lenguaje de programacion sencillo nos permite automatizar practicamente cualquier tarea que queramos llevar a cabo. Pero a su vez es interactiva, por lo que podremos interactuar con ella siempre que queramos. La forma de introducir estos comandos es desde el dispositivo de entrada por defecto, que suele ser el teclado.

Shell variable basics:

Mientras una shell esta en ejecucion siempre tiene una serie de variables con informacion importante, estas suelen estar configuradas para tomar un valor al inicio de ejecucion de la shell, pero tambien podemos modificarlas a mano. Una variable que es importante conocer es PS1, en ella se guarda lo que el sistema nos muestra en el PROMPT cuando el sistema esta listo.

Para ver el valor de la variable utilizaremos el siguiente comando:

echo $PS1

Para referirnos a las variables, siempre lo haremos con el nombre de esta, precedido del simbolo del dolar. Existe tambien PS2 que se usa para cuando la shell necesita un prompt que usar en la segunda linea de entrada de un comando. La pinta de nuestra variable PS1 podria ser la siguiente:

[\u@\h \W]\$

Para bash cada uno de estos codigos significan algo. Estos codigos seran reemplazados por algo, por ejemplo la \u es remplazado por el usuario, \h por el hostname del sistema y \W por el path del directorio actual. Es decir ese prompt una vez modificado se veria de la siguiente forma (por ejemplo):

[zordor@ojete /home]$

Este prompt no modifica el funcionamiento del sistema, simplemente pretende que sea mas sencillo el uso del propio sistema. Puedes modificar tu prompt para que se acomode mas a tu forma de trabajar sin mayor problema.

Otra variable de uso muy extendido en bash es PATH que contiene una lista de directorios donde suelen estar los comandos que se ejecutan. Seguro que estais familiarizados con el comando ls, y para ejecutarlo solo escribis eso, ls. Bueno en realidad el comando ls esta en el directorio /bin/ls seria un rollo tener que escribir eso cada vez que lo ejecutamos verdad? lo bueno es que el directorio /bin esta dentro de nuestro sistema y por eso podemos ejecutar ls sin necesidad de poner la ruta completa. Veamos el contenido de $PATH para ver que es cierto esto que os digo:

echo $PATH
/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

Efectivamente el directorio /bin estaba dentro de nuestro PATH. Como veis la sintaxis de la variable es muy sencilla, directorios separados por simbolos de dos puntos. Asi pues bash es capaz de ejecutar un comando si es un comando de bash, si la ruta de este comando esta dentro del PATH o si le indicamos la ruta completa. Es importante recordar en este punto, que el directorio actual ( . ) no esta incluido dentro del PATH por razones de seguridad.

PATH es una de las variables del sistema que se consideran parte del environment, esto son variables que necesitan para funcionar otros programas o shells y que son pasadas a estos. Para exportar una variable y convertirla por tanto en una “environment variable” tendremos que usar el comando export seguido del nombre de la variable (sin el simbolo de dolar). Si simplemente ejecutamos el comando export nos mostrara todas las variables exportadas. La misma funcion tiene el comando env . Tambien comandos parecidos son set que nos muestra las variables del sistema actuales y unset que nos limpia el listado de estas variables. Con set -o podremos ver una serie de variables que podremos modificar variables que determinan el comportamiento de bash.

Entering commands at the command prompt

Cuando introducimos un comando en la shell normalmente suele ser de la sguiente forma:

Nombre del comando (teniendo en cuenta el asunto del PATH visto en el punto anterior)
Opciones del comando: Normalmente antes llevan un guion
Argumentos que acepta el comando introducido
Y por ultimo enter.

De todos estos obligatorios solo son el primer y el ultimo punto, los otros dos dependen del caso en concreto.

Un ejemplo que tiene las 4 partes citadas seria por ejemplo

ls -la /home

Algunos comandos no requieren el guion antes de introducir las opciones de los comandos. Por ejemplo tar esta entre ellos. Esto es porque en estos comandos es necesario introducir al menos una de las opciones.

Entering commands not in the PATH

Si queremos ejecutar un comando y no esta en el PATH deberemos introducir la ruta completa de este (o introducir su ruta en el PATH).

Entering multiple-line commands interactively

Bash no solo nos permite introducir comandos si no que ademas es un completo entorno de programacion, existen libros muy completos que hablan tan solo de esto. Pero a nosotros nos interesa la parte de la lina de comandos y es que estas funciones de programacion podemos usarlas desde la propia lina de comandos. La sintaxis de los bucles se ve con mayor detalle en el siguiente examen de la certificacion. Cuando introducimos uno de estos codigos para bucles (while, until for…) la shell cambia el prompt (al del $PS2) y ahi introduciremos lo que este dentro del bucle. Si queremos escribir en una linea los comandos podremos hacerlo separados por puntos y coma. Un ejemplo practico:

$ for var in $var1 $var2 $var3
> do
> echo $var
> done

y

$ for var in $var1 $var2 $var3; do echo $var; done

Son en la practica el mismo comando.

Command History and Editing

Son muchas las ocasiones en las que queremos volver a usar un comando que acababamos de usar o que habiamos usado hace poco o queremos usarlo con alguna ligera variacion. Ademas existen otra serie de ayudas para escribir los comandos como es la edicion de lo que ya tienes escrito y el autocompletado de lo que estas escribiendo. Es eso lo que veremos en este apartado. Trabajar en una shell sin estas cosas serie una tarea bastante ardua, asi que para ser un buen profesional del sector has de maneja con total soltura con estos aspectos.

Lo primero que veremos en este aspecto es el historial, esto son los comandos ejecutados anteriormente que han sido almacenados. El numero de comandos que se guarda viene dado por la variable HITSIZE, por defecto suele estar configurada con un valor de 1000 que suele ser mas que suficiente, sin embargo tal y como hemos aprendido anteriormente hoy este valor puede ser cambiado facilmente. Si queremos que el cambio que hagamos sea definitivo deberemos introducirlo en el fichero .bash_history que se carga cada vez que lanzamos la shell desde ese usuario.

Para manejarnos entre el historial podemos usar el comando history que nos mostrara una linea de los comandos con delante un numero. Podemos realizar una serie de acciones con estos comandos que se nos indican en el comando history. Esto sustituye por el comando que indiquemos:

!! (bang-bang) Ultimo comando ejecutado
!n Sustituyendo n por el numero dado en el comando history ejecuta ese comando
!-n Es el equivalente a comenzar la lista de comandos desde abajo. Es decir !n-2 ejecutaria el penultimo comando
!string ejecuta el comando mas reciente que comience por “string”
!?string el comando mas reciente que contenga “string”
^string1^string2 repite el ultimo comando que tenga “string1” pero sustituyendo string1 por “string2”

Sin embargo no es necesario hacer uso del historial de esta forma, al menos no siempre hay formas que pueden resultar mas sencillas. Desde la tecla de cursor para arriba para desplezarnos hacia arriba en los comandos anteriormente ejecutados (es decir por el historial) a un manejo mucho mas completo, que se mueve como si estuvieramos en emacs, estas son las teclas y sus funciones: (M es la tecla meta que suele ser el alt)

Ctrl+p
Ctrl+n
Ctrl+b
Ctrl+f
Ctrl+a
Ctrl+e
Ctrl+l
M-< Va al principio del historial M-> Va hasta el final del historial
Ctrl+d Borra un caracter desde la derecha
Ctrl+k Borra el texto desde donde esta el cursor hasta el final de la linea
Ctrl+y Pega el texto que previamente has borrado
M-d Borra una palabra
Ctrl+rtext Busqueda inversa del texto
Ctrl+stext Busca el texto

Command substitution

bash nos permite hacer sustitucion por comandos. Asi pues podemos usar en una linea $(comando) y donde dice $(comando) en realidad lo que hace primero es ejcutar el comando y sutituirlo por ese resultado y despues ejecutarlo. El mismo resultado podemos lograrlo con `command`, no obstante el apostrofe este a veces tra problemas que evitamos con $(comando).

Applying commands recursively through a directory tree

Existen muchas ocasiones en las que querremos ejecutar comandos de forma recursiva, como cuando queremos ejcutar el mismo comando en cada uno de los subdirectorios de un directorio. La ejecucion recursiva es extremadamente potente pero tambien peligrosa, antes de ejecutar el comando revisalo. Algunos comandos tienen una opcion de recursividad como es el comando chmod. Con la opcion -R hacemos que el cambio que queremos hacer sea recursivo y se aplique a todos los archivos y subdirectorios. Otro comando como find es recursivo ya “por defecto” y si no le indicamos la profundidad en la busqueda lo hara hasta el final. Ademas de hacer busquedas con find podemos decir que a cada fichero que encuentre le ejecute algo, un ejemplo seria:

find /home/adam/src -name “*.c” -exec chmod g+w {} \;

Busca en la carpeta /home/adam/src los ficheros que sean .c y ejecuta el comando chmod g+w al final tenemos que poner siempre {} que sera sustituido por lo encontrado en el find y \; para indicar el final del comando y la ejecucion.

El comando find en si es extremadamente potente y merece la pena que trasteeis un rato con el y mireis su pagina man (enlazada al principio del post)

Manpages

Justamente en la linea anterior me acabo de referir a esto y ya las hemos usado anteriormente. Las man pages, son las paginas de ayuda y las tenemos disponibles en el sistema para su consulta en cualquier momento. Para acceder a ellas tan solo tendremos que escribir man y el nombre del comando, adicionalmente podemos escribir el nombre de la seccion y la pagina se abrira directamente ahi. Algunas opciones que se usan a veces:

-a muestra secuencialmente todas las paginas de man que encajen con la palabra que has introducido despues de esta opcion.
-d muestra informacion de debugging
-k busqueda en las paginas de man de algun string
-w muestra apariciones de la palabra indicada en las distintas paginas de man

Manpage format

El formato de estas paginas es standard y cumple el siguiente orden:

Nombre
Sinopsis
Descripcion
Opciones
Valores que retorna
See also (ver tambien)
bugs
Files
Copyright
Autores

Las paginas de man se encuentran en /usr/share/man pero alguna otras pueden estar en otros sitios. La configuracion de las man se encuentra aqui /etc/man.config (en debian es /etc/manpath.config) aqui le podemos indicar entre otras cosas que busque paginas de man en otros directorios adicionales. La variable para esto es MANPATH.

Los comentarios están cerrados.