Página principal

Introduccion. 1 Antecedentes históricos


Descargar 277.59 Kb.
Página2/4
Fecha de conversión18.07.2016
Tamaño277.59 Kb.
1   2   3   4

El comando "rm" borra ficheros y directorios ; para borrar el tonto1 que ya no necesitamos , podemos escribir :

$ rm tonto1

Valen metacaracteres . Si escribimos

$ rm *

nos borramos TODO lo que haya en el "directorio actual" SIN pedir confirmación.



Una opción de rm lo hace más seguro al pedirla :

$ rm -i tonto1

tonto1 ? y

La opción más peligrosa puede ser la "-r" (recursivo) que borra ficheros y directorios a partir del directorio de arranque. Por tanto , ojo con poner

$ rm -r .

si estamos en el directorio "raíz" y tenemos privilegios , podemos borrar el contenido de TODOS LOS DISCOS

Por último , veremos un comando de utilidad simililar a "ls" pero con mas opciones ; el comando "find" muestra en pantalla directorios y/o ficheros atendiendo a opciones determinadas . Si bien la sintaxis es d emasiado extensa para estudiarla en su totalidad , conviene ver algunos ejemplos :

- El comando toma como argumentos declaraciones en formato "find -print" . Por tanto , para sacar en pantalla todos los ficheros y directorios del disco , valdría con :

find / -print

- Si se desean sólo ficheros ó sólo directorios :

find / -type f -print

ó

find / -type d -print



respectivamente.

- Buscar todos los ficheros y directorios que tengan más de 30 días de antigüedad :

find / -atime +30 -print

El resto de las opciones sirve para buscar ficheros con determinados permisos , mayores ó menores que un determinado tamaño ....

2.4.9 : Directorios del sistema.

Si bien la estructura de los directorios varía entre versiones y dialectos de UNIX , podemos mencionar algunos de los más representativos :

/bin,/usr/bin,/usr/sbin,/usr/ucb: Directorios de programas ejecutables . Es aquí donde se mantienen la mayoría de los comandos (/bin/ls , /bin/vi , /usr/bin/chmod ... )

/etc : Programas y ficheros diversos : aquí residen la mayoría de los archivos de configuración y las shell-scripts de arranque y parada del equipo.

/tmp,/usr/tmp,/var/tmp : Directorios "temporales" ; el propio sistema operativo los usa como almacenamiento intermedio en muchas de sus tareas ; normalmente , todo el contenido de éstos directorios se borra al apagar el equipo.

/home,/usr/acct,/var/acct : Directorios de usuarios.

/var/adm,/usr/adm : Directorios de administración : programas de administrador , ficheros con informaciones de la paquetería instalada y demás.

/usr/log, /var/log : Directorios para ficheros de "log" de sistemas y de programas . Normalmente, existirá un fichero "console" con toda la información que se desvía a la consola del sistema , y varios ficheros informativos , de advertencia y de errores del sistema.

/lib,/usr/lib : Directorios de archivos de librería.

/usr/spool : Directorios de spool de ficheros de impresión (/usr/spool/lp) , de comunicaciones (/usr/spool/uucp) y demás.

/usr/mail : En éste directorio se halla el correo de todos los usuarios.

/usr/preserve,/var/preserve : Aquí se guardan todas las copias de ficheros incompletamente terminados por los editores de UNIX.

/dev : Directorio de ficheros de dispositivos.

/usr/games : Juegos. Casi nunca están instalados.

Resumen del editor de pantalla "vi" .

Vi es un editor de pantalla completa creado en el UNIX de Berkeley y extendido más tarde a todos los demás dialectos.

La ventaja de éste editor radica en su compatibilidad con el resto de herramientas de edición UNIX .

Vi contempla , una vez iniciada la sesión con él , dos modos :

- Modo comando : es el modo en el que arranca por defecto. Vale para dar comandos tales como : leer un fichero , escribir un fichero , búsqueda ó sustitución de caracteres dentro del texto actual ...

Este modo es al que se vuelve siempre , pulsando la tecla .

- Modo insercion/reemplazo : es el que se usa para escribir caracteres . Se entra a éste modo desde el modo comando pulsando la letra " i ".

Desde el modo comando , podemos pasar también a modo inserción escribiendo las siguientes letras :

- i : Pasar a modo inserción , delante de la posición del cursor.

- a: Igual , pero detrás de la posición del cursor.

- I : Pasar a modo inserción ,pero empezando a insertar al principio de la línea donde se esté.

- A : Igual , pero empezando al final de la línea donde se esté.

- o : Pasar a modo inserción, pero abriendo una línea nueva debajo de donde se esté.

- O : Igual , pero la línea nueva se abre arriba.

- : Pasar a modo comando.

- Backspace: Borra la última letra escrita.

- v: Identifica el carácter que vamos a escibir a continuación como un caracter especial , es decir , un escape , ó salto de hoja (^L) , ó cualquier carácter ascii entre el 1 y el 31. ( 1=^A , 2=^B .....).

Pasando a modo comando , podemos emplear las siguientes secuencias para movernos por el texto :

- ^: Ir al principio de la línea.

- $: Ir al final de la línea.

- l,h: Izquierda / derecha.

- j,k: Abajo / Arriba.

- ^F (Control + F ): Una pantalla adelante.

- ^B (Control + B ): Una pantalla atrás.

- ^G (Control +G): Enseña el número de línea donde estamos posicionados.

- 1G: Al principio del todo.

- G: Al final del todo.

- /: Busca desde la línea actual hasta el final del texto.

- / Sigue buscando más ocurrencias de la cadena.

-?: Busca desde la línea actual para atrás.

-? Sigue buscando más ocurrencias , para atrás.

-ZZ Grabar y salir.

-dd: Borrar la línea donde se esté.

-J: Juntar la línea donde se esté y la de abajo.

-r: Reemplaza una sola letra.

-R: Reemplaza todo hasta que se pulse .

-yy: yank/yank: Marca la línea actual.

-p: Copia la línea marcada despues del cursor.

-P: Copia la línea marcada antes del cursor.

-.: Repite el último cambio.

-u Undo (anula el último cambio)

-U Undo , pero en la línea actual.

Ordenes de "dos puntos" : Al pulsar en modo comando el carácter ":" , el cursor se baja a la última linea y el editor saca los dos puntos en espera de que le demos algún comando de estos. Salimos de aquí pulsando .Algunos son :

:wq! (write/quit)Grabar y salir.

:w! (write) Graba el texto en .

:r (read) Incluye el fichero como parte del texto en edición.

:! Ejecutar . Vuelve al terminar el comando.

: Ir a .

:q! (quit) Salir sin grabar.

:se nu


:se nonu Numera las líneas.(set number,set nonumber-pone y quita).

:1,5de Borra desde la 1 a la 5.

:1,5co20 Copia desde la 1 a la 5 a partir de la línea 20.

:1,5mo20 Igual, pero mueve.(desaparece desde la línea 1 a la 5).

:g/XXX/s//YYY/g Cambia en todo el texto XXX por YYY.

Hay muchísimos más comandos , pero para ir tirando , con éstos son suficientes.

3 LA SHELL

3.1 Introducción.

La shell es el programa más importante para la mayoría de los usuarios y administradores de UNIX ; con la excepción del editor de textos y del menú de administración, posiblemente es con el que m&a acute;s tiempo se trabaja.

La shell es el lenguaje de comandos de UNIX ; es un programa que lee los caracteres tecleados por los usuarios , los interpreta y los ejecuta.

A diferencia de otros intérpretes más estáticos en otros sistemas operativos , aquí existe además un completo lenguaje de programación que permite adaptar de manera relativamente sencilla el sistema operativo a las necesidades de la instalación.

Una vez que un usuario común se ha registrado cara al sistema con su login y su password , se le cede el control a la shell , la cual normalmente ejecuta dos ficheros de configuración , el general ( /etc/profile ) y el particular( /.profile ). Una vez aquí , la propia shell despliega el literal "inductor de comandos" , que normalmente será :

$

ó

#



Y el cursor en espera de que alguien escriba algún comando para ejecutar.

Tipos y propiedades.

Ya que , como hemos explicado anteriormente , la shell es un programa , existen varios , cada uno con sus características particulares . Veamos algunas de ellas:

- Bourne shell ( /bin/sh ) : Creada por Steven Bourne de la AT&T . Es la más antigua de todas y , por tanto , la más fiable y compatible entre plataformas . Esta es en la que se basan las explicaciones posteriores.

- Korn shell (/bin/ksh) : Creada por David G. Korn de los laboratorios Bell de la AT&T .Más moderna , toma todos los comandos de la Bourne y le añade varios más así como varias características de r eedición interactiva de comandos , control de trabajos y mejor rendimiento en términos de velocidad que la anterior. Existen dos versiones , una primera "maldita" y la actual , de 16/11/1988. (podemos averiguar qué versi&oa cute;n tiene la nuestra ejecutando el comando "what /bin/ksh") Pero no es oro todo lo que reluce ; cuando se trata de situaciones extremas ó complicadas donde la ksh falla, la de Bourne normalmente está más "blindada&qu ot; .

- C Shell , desarrollada por Bill Joy en la Universidad de California y , por tanto , más extendida entre UNIX BSD. Bastante más críptica que la de Bourne , incorpora no obstante sustanciales mejoras .

Estructura de las órdenes - Metacaracteres.

Cuando escribimos cualquier comando y pulsamos , es la shell y no UNIX quien se encarga de interpretar lo que estamos escribiendo y ordenando que se ejecute dicho comando. Aparte de los caracteres normales , la shell inter preta otros caracteres de modo especial : un grupo de caracteres se utiliza para generar nombres de ficheros sin necesidad de teclearlos explícitamente.

Cuando la shell está interpretando un nombre , los caracteres * ? [ ] se utilizan para generar patrones. El nombre que contenga alguno de éstos caracteres es reemplazado por una lista de los ficheros del directorio actual cuyo nombre se ajuste al patrón generado.

Las reglas de generación de patrones son :

* Vale cualquier cadena de caracteres .

? Vale un carácter cualquiera.

[ .. ] Vale cualquiera de los caracteres que coincida con los que estén entre corchetes.

Ejemplo . Supongamos que en nuestro directorio actual tenemos los siguientes ficheros :

$ ls

tonto


tonta

diario


mayor

Veamos cada una de las salidas correspondientes a las reglas anteriores :

$ ls * (valen todos)

tonto


tonta

diario


mayor

$ ls *o (todos, pero tienen que acabar en "o")

tonto

diario


$ ls tont? (que empiecen por tont y cualquier otro carácter)

tonto


tonta

$ ls tont[oa] (que empiecen por tont y el siguiente sea "o" ó "a" )

3.2 Concepto de comando / proceso.

Para comprender la manera en la cual la shell ejecuta los comandos hay que tener en cuenta las circunstancias siguientes :

- Tras sacar en pantalla el indicador $ , espera a que se le introduzca algo , lo cual será interpretado y ejecutado en el momento de pulsar .

- La shell evalúa lo que hemos escrito buscando primero si contiene un carácter "/" al principio. En caso que sea así, lo toma como un programa y lo ejecuta.

Si no , examina si se trata de una función ( o un alias,en el caso de la ksh ). Una función es una secuencia de comandos identificada por un nombre unívoco , y se verá más adelante. En caso de no encon trar ninguna con ése nombre , busca a ver si se trata de un comando interno

( exit, exec , trap , etc ) ó palabra reservada ( case,do,done,if,for .. etc) , para ejecutarlo ó pedir más entrada. Si ninguna de éstas condiciones es cierta , la shell piensa que lo que hemos escrito es un comando , y lo busca dentro de los directorios contenidos en la variable de entorno PATH . Si no está , saca un mensaje del tipo "XXXX : not found" , siendo XXXX lo que hemos escrito.

Mejor verlo con un ejemplo : supongamos que escribimos alguna aberración del tipo :

$ hola


Suponiendo que la variable PATH contenga los directorios /bin,/usr/bin y /etc , la shell busca el comando "/bin/hola" , "/usr/bin/hola" y "/etc/hola". Ya que obviamente no existe , la contestación se rá :

sh : hola : not found.

La shell utiliza UNIX para la ejecución de procesos, los cuales quedan bajo su control. Podemos definir un proceso aquí como un programa en ejecución. Ya que UNIX es multitarea , utiliza una serie de métodos de "tiempo compartido" en los cuales parece que hay varios programas ejecutándose a la vez , cuando en realidad lo que hay son intervalos de tiempo cedidos a cada uno de ellos según un complejo esquema de prioridades .

Cuando la shell lanza un programa , se crea un nuevo proceso en UNIX y se le asigna un número entero (PID) entreel 1 y el 30.000 , del cual se tiene la seguridad que va a ser unívoco mientras dure la sesión. Lo pode mos ver ejecutando el comando "ps" , el cual nos da los procesos activos que tenemos asociados a nuestro terminal.

Un proceso que crea otro se le denomina proceso padre. El nuevo proceso , en éste ámbito, se le denomina proceso hijo. Este hereda casi la totalidad del entorno de su padre (variables ,etc)., pero sólo puede modific ar su entorno , y no el del padre.

La mayoría de las veces, un proceso padre se queda en espera de que el hijo termine ; ésto es lo que sucede cuando lanzamos un comando ; el proceso padre es la shell , que lanza un proceso hijo (el comando). Cuando é ;ste comando acaba , el padre vuelve a tomar el control , y recibe un número entero donde recoge el código de retorno del hijo (0=terminación sin errores , otro valor=aquí ha pasado algo).

Cada proceso posee también un número de "grupo de procesos" . Procesos con el mismo número forman un sólo grupo, y cada terminal conectado en el sistema posee un sólo grupo de procesos. (Coma ndo ps -j) . Si uno de nuestros procesos no se halla en el grupo asociado al terminal , recibe el nombre de proceso en background (segundo plano).

Podemos utilizar algunas variantes del comando "ps" para ver qué procesos tenemos en el equipo :

ps : muestra el número de proceso (PID) , el terminal , el tiempo en ejecución y el comando. Sólo informa de nuestra sesión.

ps -e : de todas las sesiones.

ps -f : full listing : da los números del PID,del PPID(padre),uso del procesador y tiempo de comienzo.

ps -j : da el PGID (número de grupo de los procesos - coincide normalmente con el padre de todos ellos)

Este comando puede servirnos para matar ó anular procesos indeseados. Se debe tener en cuenta que cada proceso lleva su usuario y por tanto sólo el ( ó el superusuario ) pueden matarlo.

Normalmente , si los programas que componen el grupo de procesos son civilizados , al morir el padre mueren todos ellos siempre y cuando el padre haya sido "señalizado" adecuadamente. Para ello , empleamos el comando &q uot;kill - PID, siendo PID el número del proceso ó del grupo de procesos.

Los números de señal son :

-15 : TERM ó terminación. Se manda para que el proceso cancele ordenadamente todos sus recursos y termine.

-1 : corte

-2 : interrupción.

-3 : quit

-5 : hangup

-9 : kill : la más enérgica de todas pero no permite que los procesos mueran ordenadamente.

3.3 Entrada y salida. Interconexión.

Para cada sesión , UNIX abre tres ficheros predeterminados , la entrada estándar, la salida estámdar y el error estándar , como ficheros con número 0,1 y 2. La entrada es de donde un comando obtiene su información de entrada ; por defecto se halla asociada al teclado del terminal . La silida estándar es donde un comando envía su resultado ; por defecto se halla asociada a la pantalla del terminal ; el error estándar coincide con la salida estándar, es decir,con la pantalla.

A efectos de modificar éste comportamiento para cualquier fin que nos convenga , la shell emplea 4 tipos de redireccionamiento :



< Acepta la entrada desde un fichero.

> Envía la salida estándar a un fichero.

>> Añade la salida a un archivo existente. Si no existe , se crea.

| Conecta la salida estándar de un programa con la entrada estándar de otro.

Intentar comprender éstas explicaciones crípticas puede resultar cuanto menos, confuso ; es mejor pensar en términos de "letras" :

< En vez de coger líneas del teclado , las coge de un fichero. Mejor , adquirir unos cuantos conceptos más para entender u ejemplo.

> Las letras que salen de un comando van a un fichero. Supongamos que ejecutamos el comando ls usando ésto :

$ ls > cosa

$ ( .. parece que no ha pasado nada ... )

$ ls

tonto


tonta

diario


mayor

cosa


$ ( .. se ha creado un fichero que antes no estaba - cosa ... )

$ cat cosa

tonto

tonta


diario

mayor


cosa

$ ( .. y contiene la salida del comando "ls" ... )

 

>> En vez de crear siempre de nuevo el fichero , añade las letras al final del mismo.



| El comando a la derecha toma su entrada del comando de la izquierda. El comando de la derecha debe estar programado para leer de su entrada ; no valen todos.

Por ejemplo , ejecutamos el programa "cal" que saca unos calendarios muy aparentes . Para imprimir la salida del cal , y tener a mano un calendario sobre papel , podemos ejecutar los siguientes comandos :

$ cal 1996 > /tmp/cosa ( el fichero "cosa" contiene la salida del "cal" )

$ lp /tmp/cosa ( sacamos el fichero por impresora ).

Hemos usado un fichero intermedio. Pero , ya que el comando "lp" está programado para leer su entrada , podemos hacer (más cómodo, y ahorramos un fichero intermedio) :

$ cal 1996 | lp

El uso de la interconexión (pipa) exige que el comando de la izquierda lance información a la salida estándar. Por tanto , podríamos usar muchos comandos, tales como cat , echo , cal , banner , ls , find , wh o ..... Pero , el comando de la derecha debe estar preparado para recibir información por su entrada ; no podemos usar cualquier cosa . Por ejemplo , sería erróneo un comando como :

ls | vi


(si bien ls si saca caracteres por su salida estándar , el comando "vi" no está preparado para recibirlos en su entrada).

Y la interconexión no está limitada a dos comandos ; se pueden poner varios , tal que así:

cat /etc/passwd | grep -v root | cut -d":" -f2- | fold -80 | lp

(del fichero /etc/passwd sacar por impresora aquellas líneas que no contengan root desde el segundo campo hasta el final con un ancho máximo de 80 columnas).

Normalmente , cualquier comando civilizado de UNIX devuelve un valor de retorno ( tipo ERRORLEVEL del DOS ) indicando si ha terminado correctamente ó bien si ha habido algún error ; en el caso de comandos compuestos como e s éste , el valor global de retorno lo da el último comando de la pipa ; en el último ejemplo , el retorno de toda la línea sería el del comando "lp".

3.5 Variables de entorno.

Una variable de entorno en la shell es una referencia a un valor. Se distinguen dos tipos : locales y globales.

Una variable local es aquella que se define en el shell actual y sólo se conocerá en ese shell durante la sesión de conexión vigente.

Una variable global es aquella que se exporta desde un proceso activo a todos los procesos hijos.

Para crear una variable local :

# cosa="ANTONIO ROMERO"

Para hacerla global

# export cosa

Para ver qué variables tenemos:

# set

LOGNAME=root



TERM=vt220

PS1=#


SHELL=/bin/sh

( .. salen mas .. )

Una variable se inicializa con la expresión = . Es imprescindible que el carácter de igual ‘=‘ vaya SIN espacios. Son lícitas las siguientes declaraciones :

# TERM=vt220

# TERM="vt220"

(TERM toma el mismo valor en ambos casos)

# contador=0

Una variable se referencia anteponiendo a su nombre el signo dòlar ‘$’. Utilizando el comando ‘echo’ , que imprime por la salida estándar el valor que se le indique , podemos ver el contenido de algunas de éstas va riables :

# echo TERM

TERM


(!! MUY MAL!! - Hemos dicho que la variable se referencia por $).

# echo $TERM

vt220

(AHORA SI)



Otra metedura de pata que comete el neófito trabajando con variables :

# $TERM=vt220

Y el señor se queda tan ancho. Investigando qué és esto , la shell interpreta que le queremos poner algo así como "vt220=vt220" , lo cual es erróneo.

Para borrar una variable , empleamos el comando "unset" junto con el nombre de la variable que queremos quitar , como :

# echo $cosa ( saca el valor de dicha variable )

ANTONIO ROMERO ( el que le dimos antes )

# unset cosa ( BORRAR la variable )

# echo $cosa

# ( ya no tiene nada )

Cuidadito con borrar variables empleadas por programas nativos de UNIX , tales como TERM ! Si borráis ésta variable , el editor "vi" automáticamente dejará de funcionar.

Otro problema que es susceptible de suceder es el siguiente : supongamos una variable denominada COSA y otra denominada COSAS . La shell , en el momento de evaluar la expresión "$COSAS" , se encuentra ante la siguiente disyuntiva :

- Evaluar $COSA y pegar su contenido a la "S" ( + "S" )

- Evaluar $COSAS , empleando intuición.

Cara a la galería , ambas evaluaciones por parte de la shell serían correctas , pero dependiendo de lo que nosotros queramos hacer puede producir efectos indeseados. A tal fin , en conveniente utilizar los caracteres " ;llave" -{}- para encerrar la variable que queremos expandir. De tal forma , para reflejar "COSA" , escribiríamos :

${COSA}

Y para reflejar "COSAS" ,



${COSAS}

Con lo que tenemos la seguridad de que las variables siempre son bien interpretadas . Las llaves se utilizan SIEMPRE en el momento de evaluar la variable , no de asignarle valores. No tiene sentido hacer cosas como {COSAS}=tonterí ;a.

Algunas de las variables usadas por el sistema ó por programas del mismo son:

HOME:: Directorio personal . Usado por el comando "cd" , se cambia aquí al ser llamado sin argumentos.

LOGNAME: Nombre del usuario con el que se ha comenzado la sesión.

PATH: Lista de rutas de acceso , separadas por dos puntos ‘:’ y donde una entrada con un sólo punto identifica el "direcorio actual". Son válidas asignaciones como:

# PATH=$PATH:/home/pepe:/home/antonio

PS1: Símbolo principal del indicador de "preparado" del sistema. Normalmente , su valor será ‘#’ -o ‘$’.

TERM: Tipo de terminal.

Podemos ver cómo se inicializan las variables consultando los ficheros de inicialización. Estos ficheros son :

/etc/profile: Fichero de inicialización global . Significa que , tras hacer login , todos los usuarios pasan a través del mismo. Inicializa variables como PATH , TERM ....

/.profile: Fichero particular , reside en el "home directory" del usuario en cuestión. Es , por panto , particular para cada uno de ellos y es aquí donde podemos configurar cosas tale s como que les salga un menú al entrar , mostrarles el correo ...

3.6 Sustitución de comandos : acción de las comillas en la shell.

Dependiendo de cuales sean las comillas utilizadas en una expresión , los resultados son los siguientes:

- Carácter backslash \ :Quita el significado especial del carácter a continuación de la barra invertida.

1   2   3   4


La base de datos está protegida por derechos de autor ©espanito.com 2016
enviar mensaje