Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CURSO BÁSICO
DE LINUX
ÍNDICE
1. INTRODUCCIÓN ............................................................................................................. 1
1.1 Sistemas operativos .................................................................................................... 1
1.2 Breve historia del sistema operativo UNIX ............................................................... 2
1.3 Características generales del S.O. UNIX ................................................................... 2
3. FICHEROS ........................................................................................................................ 9
3.1 Concepto y tipos de ficheros ...................................................................................... 9
3.1.1 Denominación de ficheros ...................................................................................................9
3.2 El sistema de ficheros. Directorios ........................................................................... 10
3.3 Manipulación de directorios ..................................................................................... 11
3.4 Manipulación de ficheros ......................................................................................... 11
3.5 Protecciones de ficheros ........................................................................................... 13
4. PROCESOS Y ENTORNO.............................................................................................. 16
4.1 Concepto de proceso ................................................................................................ 16
4.2 Concepto de entorno................................................................................................. 16
4.3 Visualización de procesos ........................................................................................ 17
4.4 Variables................................................................................................................... 18
1. INTRODUCCIÓN
Estos recursos básicos se utilizan para diferentes tipos de operaciones, las cuales pueden
clasificarse de la siguiente manera:
Ejecución de comandos.
Creación y mantenimiento de ficheros.
Control de redes.
Ejecución de procesos en general.
El Sistema Operativo, por tanto, establece la comunicación entre usuario y hardware a dos
niveles:
El kernel, que está constituido por el código máquina que coordina el hardware, a fin
de que efectúe las distintas operaciones requeridas.
Las características citadas son comunes a todos los sistemas operativos. De todos ellos,
probablemente los más utilizados en la actualidad sean el UNIX y el DOS. Veamos qué
diferencias fundamentales pueden establecerse entre estos dos sistemas.
En general, UNIX es un sistema mucho más potente que DOS, y por tanto requiere
mayores-prestaciones de los computadores sobre los que trabaja.
A comienzos de la década de los 70, el sistema UNIX fue cedido a las universidades,
alcanzando pronto gran popularidad, debido a varias razones:
La llegada del sistema UNIX a la Universidad de Berkeley supuso un gran impulso, hasta el
punto de que lanzó: su propia versión. Fue en este momento cuando AT&T lo comenzó a
comercializar, al tiempo que Berkeley continuaba desarrollando el sistema, añadiendo más
capacidades, a lo largo de varias versiones, hasta llegar a la actualidad.
UNIX de AT&T
Berkeley
Sistemas con licencia por AT&T
Asimilados
El UNIX AT&T es el UNIX standard; los sistemas con licencia deben estar autorizados por
AT&T. Habitualmente los sistemas con licencia incluyen el UNIX AT&T al que añaden
ciertas capacidades adicionales.
Los asimilados no son UNIX realmente (UNIX sólo es el de AT&T y Berkeley) pero su
funcionamiento y estructura es casi la misma.
Todos los sistemas UNIX tienen una serie de características comunes, que deben ser tenidas
en cuenta. Básicamente son:
Un usuario normal es una persona que tiene permiso para utilizar el sistema. A su vez, los
usuarios están distribuidos por grupos, asignados por el manager, y que habitualmente reciben
a usuarios con tareas similares.
A diferencia de un computador personal al que cualquiera puede acceder una vez puesto en
marcha, en UNIX sólo los usuarios pueden acceder. Cuando se enciende un computador
bajo UNIX, el sistema, después de realizar una serie de tests y operaciones previas, lanza este
mensaje a pantalla:
login:
Esa es la señal de que el sistema está preparado para atender la petición de acceso de un
usuario. El usuario es reconocido por el sistema mediante el nombre de usuario. Este nombre
puede estar formado por cualquier cadena de caracteres (con un máximo de 8 caracteres,
normalmente), y es introducido al sistema por el manager.
Una vez introducido el nombre, se accede al sistema, de forma que en la pantalla aparecerá el
prompt, representado habitualmente por el símbolo $. A partir de este momento, el usuario
ejecutará los comandos y procesos que desee.
Así pues, un usuario sólo necesita su nombre para acceder al sistema. Sin embargo, cualquier
persona que posea este dato puede acceder al sistema en nombre de otro. Para evitar esto, un
usuario puede protegerse mediante la utilización de una palabra clave o password. La
asignación del password es realizada por el propio usuario, mediante el comando passwd.
Este comando solicita al usuario el password, que será introducido por duplicado para evitar
confusiones, ya que su tecleado no se refleja en la pantalla. El password es, habitualmente,
una cadena de al menos 6 caracteres, entre los cuales debe existir una cifra al menos. De esta
forma, el usuario queda protegido, de modo que al solicitar acceso al sistema, tras el login,
aparecerá el mensaje
password:
indicando que el mismo debe ser introducido. Si éste no es correcto, volverá a lanzarse a
pantalla el mensaje login:
Si alguien teclea un nombre no autorizado, el sistema le solicita el password, con el fin de que
no sepa si ese usuario existe o no.
Una vez terminado el trabajo, el usuario debe abandonar el sistema, lo que hará mediante el
comando exit o bien con las teclas ctrl-d.
Un comando es una orden propia del sistema que realiza una función determinada. Una
aplicación es un programa de computador creado por un usuario, que igualmente transmite
órdenes al computador. Operativamente, no existe ninguna diferencia entre comando y
aplicación. La única distinción reseñable entre ambos es el hecho de que el comando
pertenece al sistema operativo, y en todos los UNIX standard el mismo comando ejercerá la
misma función. En UNIX los distintos comandos están escritos originalmente en lenguaje C
como ya se indicó previamente.
Cuando se ejecuta un comando, debe tenerse en cuenta el formato del comando. De manera
general, este formato responde a la siguiente estructura.
El comando es, sin más, su nombre, que lo distingue de los demás, y que permite al sistema
determinar la orden a ejecutar cuando es tecleado. Los comandos siempre se escriben en letras
minúsculas.
$ cmd -b ó $ cmd –c
Entre comando y opción debe existir al menos un espacio en blanco (y no comas, guiones u
otros caracteres). El espacio en blanco es el separador universal en UNIX). No deben dejarse
espacios en blanco entre las distintas opciones de un comando. Además, debe indicarse que
antes de escribir el comando pueden dejarse tantos espacios en blanco como se desee, con una
sola excepción: el comando exit que debe ir situado al comienzo de la línea.
Un argumento es “aquello” sobre lo que recae la acción del comando, o bien una información
externa suministrada por el usuario y que resulta necesaria para la ejecución del comando. En
muchas ocasiones, los argumentos serán ficheros del sistema.
El número de argumentos que puede utilizar un comando puede decirse que es ilimitado, si
bien raras veces se usan más de dos. Entre un argumento y las opciones (en caso de haberlas)
debe existir al menos un espacio en blanco, al igual que entre los distintos argumentos entre
sí.
Cuando se ha escrito correctamente un comando, debe presionarse la tecla INTRO, con lo que
el comando es ejecutado. Siempre que se pulsa INTRO, el cursor de pantalla se situará en el
primer lugar de la línea siguiente de la pantalla.
Pueden combinarse varios comandos en una misma línea a través del símbolo ‘;’. Sin
embargo, esta no es una práctica aconsejable.
date: escribe, en pantalla la fecha y hora del sistema. Este comando no utiliza
argumentos habitualmente, si bien posee numerosas opciones. Excepcionalmente, las
opciones van precedidas por el signo + en lugar de -. Además, todas sus opciones
comienzan con el símbolo %. Las más importantes son:
El comando date también permite modificar la fecha y hora del sistema. Esta función sólo le
está permitida al manager; en este caso el comando utiliza un argumento compuesto por 10
cifras, con la siguiente estructura.
$ date mm dd hh nn aa
mm = mes
dd = día
hh = hora
nn = minuto
aa = año
who: este comando indica qué usuarios están conectados al sistema en un momento
determinado.
Habitualmente, este comando no lleva argumentos. Cuando se utiliza, aparecen en pantalla los
usuarios que en ese momento se hallan conectados al sistema. Por cada usuario, se escribe el
nombre, la terminal a la que está conectado, la fecha y la hora de conexión. Sus principales
opciones son:
Además de éstas, el comando posee la opción ‘am i’, escrita sin guión (who am i) y que
proporciona el nombre del usuario conectado a mi terminal. No debe confundirse con
whoami comando que realiza la misma función, “whoami” es un comando, mientras que
“who am i” es un comando con una opción.
El comando man siempre lleva un argumento, que es el nombre del comando del cual
queremos la información. Posee una opción, la “k” con la cual, se obtiene una información
más resumida que en el caso anterior.
3. FICHEROS
Algo importante a tener en cuenta es el hecho de que en UNIX son ficheros tanto lo que
habitualmente se conoce como ficheros, como los directorios, e incluso los periféricos
(discos, terminales, teclados, impresoras, ....). Estos últimos son denominados device files y
pueden ser de dos tipos: character (o especial) y block.
Cada fichero tiene un propietario, que es el usuario que lo ha creado (ya sea mediante un
editor o mediante copia de otro).
Los nombres de los ficheros pueden estar constituidos por cualquier cadena de caracteres
(salvo algunos caracteres especiales, como *, /, etc.) hasta un máximo de 14. Debe recordarse
que en UNIX se distinguen mayúsculas y minúsculas, y por lo tanto el fichero FILE será
distinto del fichero file.
Un dato importante es que en UNIX, al contrario que en otros sistemas como el DOS, no
existen extensiones para los nombres. Así pues, un fichero denominado file.abc tiene un
nombre de 8 caracteres, no un nombre de 4 con una extensión de 3.
Por otra parte, para cada fichero (cualquier tipo de ficheros) deben distinguirse su nombre
absoluto y los nombres relativos.
El nombre absoluto de un fichero es el formado por todos los directorios por los que se debe
pasar para, partiendo del directorio raíz, llegar al fichero. Los nombres absolutos siempre
comienzan por /. Un fichero sólo tiene un nombre absoluto. Sin embargo, puede tener
diversos nombres relativos, tantos como directorios haya en el sistema.
Cuando un sistema UNIX está instalado, tiene definidos una serie de directorios con nombres
standard, y cuya estructura es la siguiente:
Por supuesto, los usuarios pueden definir sus propios directorios. Los contenidos básicos de
los directorios indicados suelen ser los siguientes:
bin: contiene diferentes comandos del sistema, habitualmente los más utilizados.
usr: contiene comandos menos utilizados que los anteriores, o bien ficheros
referentes a aplicaciones externas al sistema.
lib: librerías de ficheros objeto (gráficas, matemáticas...).
etc: ficheros propios de la administración del sistema.
users: directorios login de los usuarios.
dev: ficheros asociados a los periféricos del sistema.
lost+found: directorio utilizado en ciertas tareas de la administración del sistema.
Habitualmente estará vacío.
tmp: directorio de ficheros temporales. Suele utilizarse cuando se instala alguna
aplicación o revisión del sistema, o cuando se producen errores en ciertas aplicaciones.
Hay una serie de directorios particulares para los usuarios que es necesario considerar:
mkdir: crea uno o más directorios, con los nombres indicados como argumentos:
rmdir: borra los directorios indicados como argumentos, con la condición de que
estén vacíos.
ls: escribe en pantalla los nombres de los ficheros que contiene el directorio(s)
indicado como argumento. Salvo aquellos cuyo nombre empieza por el símbolo .. Si
no se da argumento, se toma por defecto el directorio actual. Los ficheros salen
ordenados alfabéticamente (primero las mayúsculas, después las minúsculas). Si el
argumento es un fichero no directorio, escribirá el nombre sin más.
-a: muestra en pantalla todos los ficheros del directorio, incluidos aquellos cuyo nombre
comienza por ..
-d: si el argumento es un directorio, muestra sólo su nombre, no su contenido.
-s: además del nombre, se muestra el tamaño de cada fichero en bloques (1 bloque = 512
bytes).
-t: los ficheros salen ordenados cronológicamente y no alfabéticamente.
-F: detrás de cada directorio aparece el símbolo /, detrás de cada fichero ejecutable el
símbolo * y detrás de cada link simbólico el símbolo @.
-R: opción recursiva. Si alguno de los ficheros del directorio es a su vez un directorio, se
muestra en pantalla su contenido, y así sucesivamente hasta completar todos los niveles
de ficheros.
-l: para cada fichero muestra una línea con una serie de informaciones adicionales. El
formato de cada línea es el siguiente.
$ cp F1 F2
F1 y F2 pueden ser nombres relativos o absolutos. Si F2 no existe, se crea un fichero con ese
nombre. Si F2 existe y es un directorio, se crea en F2 un fichero con el nombre de F1. Si F2
existe y no es directorio, su contenido desaparece y es sustituido por el de F1.
El comando puede tener más de dos argumentos (nunca menos). En este caso, es necesario
que el último de ellos sea un directorio de modo que todos los demás representarían ficheros
que serán copiados a ese directorio con el nombre original.
El comando cp posee una opción, la -r, que permite copiar directorios de forma recursiva, es
decir, copiando íntegramente su contenido (y el de los directorios que contenga) en otro
directorio.
Un link de un fichero es una copia virtual del mismo. Es como tener un fichero con
varios nombres o en distintos directorios, de modo que todos representan el mismo fichero,
hasta el punto de que una modificación realizada en uno de ellos se traslada a todos.
rm: borra los ficheros indicados como argumentos. Este comando presenta dos
opciones principalmente:
-i: por cada fichero que va a ser borrado se pide al usuario la confirmación de la
operación.
-r: opción recursiva. Se utiliza con directorios y permite borrar todo el contenido del
directorio, incluidos los ficheros de los directorios que contenga hasta el último nivel. Esta
opción debe manejarse con mucha precaución.
Cada fichero posee tres tipos de permisos: permiso de lectura, permiso de escritura y permiso
de ejecución.
Los permisos actúan en tres niveles diferentes: permisos para el propietario, permisos para el
grupo del propietario y permisos para el resto de los usuarios. De los 9 caracteres que
representan los permisos, los 3 primeros representan los permisos del propietario, los tres
siguientes son los permisos de los usuarios pertenecientes al grupo del propietario. Los tres
últimos corresponden a los permisos del resto de usuarios.
Para cada uno de esos niveles definen los permisos de lectura, escritura y ejecución. Todo lo
que se explique a continuación para un nivel es aplicable a los otros dos.
El permiso de lectura se representa por una r, el de escritura por una w y el de ejecución por
una x. Si el permiso existe, la letra aparece en la posición correspondiente. De lo contrario,
aparecerá un guión.
Permiso de lectura: para un fichero o directorio, quiere decir que no se puede ver su
contenido. Por tanto, no puede ejecutarse el comando cat en caso de fichero, o ls en
caso de directorio.
Los permisos de un fichero sólo pueden ser modificados por su propietario (y por el manager,
evidentemente). Para ello, se utiliza el comando chmod, que puede ser utilizado en dos
formas distintas:
El primero de los argumentos, como puede verse, es una combinación de tres datos: el
nivel al que va a afectar la modificación (propietario, grupo, otros), el tipo de modificación
(adición de un permiso, eliminación o asignación), y por último, el permiso o permisos
implicados en la modificación. El nivel de la modificación se indica mediante las letras:
u (propietario)
g (grupo)
o (otros)
r lectura.
w escritura.
x ejecución.
La estructura del comando en esa segunda forma es similar a la primera. Sin embargo, el
primer argumento en este caso se expresa mediante tres cifras. Cada una de las cuales toma
valores ente 0 y 7. La primera de ellas indica los permisos del propietario; la segunda, los del
grupo, y la última los de los otros usuarios.
Para cada nivel, existen 8 posibles combinaciones de sus permisos de lectura, escritura y
ejecución, que se representan por cada uno de los 8 valores comprendidos entre 0 y 7.
r w x
4 2 1
4. PROCESOS Y ENTORNO
Los procesos se reconocen en UNIX por un número identificador (PID). Este número, es
asignado directamente por el sistema, y es distinto para todos los procesos que se ejecutan
simultáneamente en el sistema.
Ahora bien, la mayoría de las informaciones del entorno de distintos procesos serán comunes.
Por ello, la forma más sencilla de obtener el entorno de un proceso es copiárselo al padre.
Esta copia se hace a través de una llamada interna del sistema denominada fork. El fork
produce un proceso (que incluye al entorno) exactamente igual al proceso padre. Sin embargo,
cuando el fork ha sido llamado, es cuando se produce la diferenciación entre, proceso padre
e hijo. En este momento, al hijo se le asigna el PID correspondiente.
Una vez ejecutado el fork, se dispone de dos procesos prácticamente idénticos. Sin
embargo, lo que se desea es que el proceso hijo realice su propia misión. Por ello, una vez
creado, el proceso hijo se desprende de las instrucciones que debe ejecutar el padre, y adopta
sus propias instrucciones, que tomará del fichero correspondiente. Esto se realiza mediante
otra llamada interna denominada exec. Así pues, cuando se ejecute un proceso, internamente
se ejecutará una secuencia fork-exec.
La opción más importante es la ef (ps -ef), que proporciona una lista de todos los
procesos que están ejecutándose en el computador, independientemente de la terminal. Por
cada proceso se obtienen una serie de informaciones, según el esquema siguiente.
root 118 1 0 Aug 20 ? 0:00 LmSpool
Como se observa, por cada proceso aparecen ocho campos, cuyas significados son los
siguientes:
4.4 Variables
Una variable es una información a la que se asigna un nombre. A primera vista, puede parecer
que una variable es lo mismo que un fichero. Sin embargo, existen dos diferencias
importantes: la primera es que las variables no residen físicamente en ningún disco. La
segunda es que la información de las variables es información propia de un proceso. Así, tas
informaciones del entorno de un proceso residen en variables. Las variables existentes en un
momento y en un entorno dados pueden ser de dos tipos:
Variables de entorno: son aquéllas que transmiten el valor (con el mismo nombre) a
los
procesos hijo. Contienen informaciones que forman parte del entorno de un proceso.
Debe quedar claro que las variables de entorno transmiten la información a los procesos
hijo, pero no al revés. Es decir, si una variable de entorno en un proceso hijo es alterada, el
entorno del proceso padre no será modificado.
Las variables pueden ser clasificadas también según otro criterio en:
Variables de usuario: todas las variables asignadas por el usuario, y que no tienen un
contenido fijo.
Como puede deducirse de esto último, un usuario puede definir las variables que quiera. Para
crear una variable, basta con asignarle un valor de la forma siguiente:
$ VAR=valor
Cuando se define una variable, ésta no es de “entorno”. Para que lo sea, se ejecuta el comando
export, de la siguiente manera:
De esta forma, las variables situadas como argumentos del comando pasan a ser variables de
entorno y como tales, cederán su nombre y contenido a los procesos hijo.
Existe otro comando, el set que permite ver el valor de todas las variables existentes, ya
sean de entorno o locales. Por último, el comando unset seguido del nombre de una
variable, elimina esa variable.
$ A=$A$B
asigna a la variable A el contenido que tenía junto con la variable B o bien la expresión
$ A=$A:b
Como ya se ha indicado, siempre que se está en una sesión UNIX existe un proceso en
ejecución que es el shell, o sh. Su función es interpretar los comandos ejecutados por los
usuarios. El proceso tiene su soporte en un comando también llamando sh, el cual puede ser
ejecutado por un usuario. Si se ejecuta
$ sh
simplemente aparecerá el prompt ($). Sin embargo, hemos ejecutado un proceso que está en
activo, y que no desaparecerá hasta que finalice, lo que conseguiremos mediante el comando
exit, o Ctrl-d.
Este comando, sh, dentro del cual se efectúan todas nuestras operaciones en el sistema, posee
gran cantidad de particularidades y capacidades que se van a estudiar en este capítulo y en los
posteriores.
5.1 Metacaracteres
Un metacarácter es un carácter que tiene un significado especial, independiente de su propio
símbolo. Así, el / es un metacarácter, pues aparte del "slash" representa el directorio raíz
(más adelante se verá que también representa el símbolo de la división). Los principales
metacaracteres son los siguientes:
$ echo A
$ echo $A
mostrará en pantalla 1.
*: este símbolo, al lado de algún otro carácter, sustituye a cualquier posible conjunto de
caracteres (salvo el •) que pudiera ir colocado en esa posición (en DOS tiene un significado
similar). Así, el comando
$ ls a*
mostraría en pantalla los nombres de todos los ficheros del directorio actual cuyo nombre
empieza por a. O bien, el comando
$ ls *a
mostraría los nombres de todos los ficheros del directorio actual cuyo nombre termina en a.
Si el símbolo * se emplea solo, representa a todos los ficheros del directorio actual.
Además de este significado, más adelante se verá cómo también representa el símbolo de la
multiplicación.
No es conveniente utilizar los metacaracteres en los nombres de los ficheros, con el fin de
evitar problemas. Sin embargo, en alguna ocasión puede ser preciso su utilización como tal
símbolo, evitando el carácter especial. Para ello se utiliza el metacarácter, \ (back-slash) que
antepuesto a otro metacarácter anula el significado especial del mismo. Así, el resultado de
los siguientes comandos será:
$ A=1
$ echo $A 1
$ echo \$A $A
5.2 Redireccionamientos
Cuando se ejecuta un proceso, éste habitualmente conlleva una entrada y una salida. En
algunos comandos puede no existir alguna de las dos. Normalmente, los datos necesarios para
la ejecución de un proceso se introducen en el momento de su ejecución a través del teclado,
que constituye la entrada standard, o standard input. De la misma forma, la salida del proceso
(el resultado de su ejecución) se refleja habitualmente en la pantalla, que constituye la salida
standard, o standard output. Igualmente, si se produce algún error durante la ejecución del
proceso, la correspondiente salida se reflejará también en pantalla, que construye así la salida
standard de errores, o error output.
$ ls
no podré ver todos en la pantalla. Por ello, será más conveniente desviar la salida a un fichero,
que podré posteriormente editar o visualizar tranquilamente a través de un comando more.
El proceso anterior direcciona la salida del proceso PROC al fichero fich, de modo que en
pantalla sólo aparecerá el prompt ($) a la finalización del mismo. Si el fichero no existe lo
crea, pero si existe, BORRARÁ SU CONTENIDO, y lo sustituirá por la salida del proceso.
El redireccionamiento de salida no incluye la salida de errores, sino sólo la salida habitual del
proceso. Si se desea redireccionar los errores, puede hacerse mediante el símbolo 2>:
$ PROC 2> F1
$ mail < F1
5.3 Pipelines
Un pipeline, o simplemente pipe, es un procedimiento por el que se conectan dos procesos,
de forma que la salida del primero pasa a ser la entrada del segundo. El pipe se representa por
el símbolo |:
$ P1|P2
$ ls > F1
$ more F1
permite ver de forma pausada los ficheros contenidos en el directorio actual. Para ello, se ha
redireccionado la salida de ls al fichero F1, y luego se ha leído el contenido del fichero
mediante el comando more. Esta operación puede hacerse de un sólo golpe a través de un
pipe:
$ ls|more
El resultado es que cada vez que la pantalla se llene, se detendrá, para que pueda ser leída. En
este caso, more toma sus datos de entrada a partir de la salida de ls (que no se refleja en la
pantalla).
Como puede verse, existe una cierta similitud entre el pipe y el redireccionamiento. Sin
embargo, hay dos diferencias fundamentales:
5.3.1 Filtros
Algunos comandos pueden actuar como filtros. Un filtro es un proceso situado entre dos pipe,
de modo que su actuación sobre los datos de entrada (salida del primer proceso) no se refleja
en pantalla, sino que pasa a ser la entrada del segundo pipe. En apartados posteriores se
indicarán ejemplos de filtros.
$ VAR=`PROC`
En la estructura anterior la variable VAR pasa a tomar el valor de la salida del proceso
PROC.
En caso de que no se proporcione ningún argumento, se ordenará todo lo que desde ese
momento se introduzca a través del teclado, hasta que se pulsa Ctrl-d.
En ocasiones, las líneas de un fichero pueden estar compuestas por diferentes campos. En
este caso, la ordenación puede realizarse según los símbolos de un campo determinado. Para
ello, se utiliza una opción, de la forma +N, donde N indica el número de campos que deben
saltarse para realizar la ordenación.
En estos casos, debe indicarse al comando cuál es el separador de campo, lo cual se realiza
mediante la opción t, seguida del separador (por defecto, el separador es el espacio
en blanco). Así, el comando
realiza la ordenación del fichero file numéricamente, utilizando el campo 3 (se salta dos
campos) siendo el separador de campo el símbolo (:)
El primer argumento marca la cadena de caracteres que debe ser localizada. Los restantes
indican los ficheros donde debe ser localizada la cadena.
En caso de que la cadena exista, en pantalla aparecerá la línea completa en que se halla. Si se
han dado varios ficheros para la localización, además de la línea aparecerá el nombre del
fichero.
-v: Funcionamiento inverso: se escriben todas las líneas salvo aquellas en las que se
ha hallado la cadena.
-c: sólo se obtiene la cantidad de líneas en las que se ha hallado la cadena.
-i: se ignora la distinción entre letras mayúsculas y minúsculas.
-l: sólo se indican los nombres de los ficheros en los que aparece la cadena (el
nombre aparece sólo una vez, independientemente del número de líneas que tenga la cadena).
-n: las líneas van precedidas por su número de orden dentro del fichero.
-e: se utiliza cuando la cadena a buscar comienza por el signo -.
-s: se suprimen los mensajes de error correspondientes a ficheros no existentes o sin
permiso de lectura.
6.3 Comando wc
Este comando sirve para contar líneas, palabras y caracteres de un fichero. Su estructura es:
$ wc [opc] ficheros
La salida por pantalla es el número de líneas, palabras y caracteres del fichero seguido del
nombre del fichero.
Estas opciones pueden combinarse para obtener dos de las cuentas. Por palabra se entiende
cualquier conjunto de caracteres separado por espacios en blanco.
$ proc1|tee file|proc2
El comando puede llevar la opción -a, con la cual añade su entrada al fichero indicado (en
lugar de crear el fichero con esa entrada), en lugar de sobrescribirlo.
Existen dos posibles funcionamientos de cut: corte por caracteres, o corte por campos,
indicado cada uno de ellos por la correspondiente opción.
Con la opción f puede utilizarse además la opción s, indicando que las líneas que no tienen
ningún separador de campo son suprimidas:
6.6 Comando pr
Este comando es similar al cat, si bien su función es mostrar en pantalla el contenido de un
fichero preparado para ser impreso, es decir, con cabecera, separación de páginas, definición
de márgenes, etc. Su estructura es la siguiente:
$ pr [opc] ficheros
Este comando se utiliza habitualmente en un pipe junto con el comando lp, que se verá a
continuación.
6.7 Comando lp
Este comando imprime en la impresora el fichero indicado como argumento. Su estructura es:
$ lp ficheros
El comando lp envía los trabajos a la cola de impresión. Por tanto, la terminal queda
disponible para seguir trabajando. El control de la cola de impresión se hace a través del
comando lpstat. Este comando no utiliza argumentos. Muestra en pantalla la lista de
trabajos en espera de impresión.
+: suma.
-: resta.
*: multiplicación. Debe ir precedido de \ para eliminar el metacarácter.
/: división. Debe ir precedido de \ para eliminar el metacarácter.
%: resto de la división.
Por ello, si se desea la ejecución de varios procesos simultáneamente, en una única terminal,
estos procesos deben ejecutarse en background.
Para lanzar un proceso en background, lo único que hay que hacer es añadir al final del
proceso un &:
$ proc &
Si un proceso tiene salida por pantalla, el hecho de ser lanzado en background no la elimina.
Esto daría lugar a una pérdida de eficacia, ya que si la pantalla está ocupada por esa salida, no
seremos capaces de controlar, adecuadamente la terminal. Por ello, siempre que se lance un
proceso en background deben redireccionarse tanto la salida como la salida de errores.
Este comando permite lanzar un proceso en background, sin que se interrumpa cuando el
usuario abandone la sesión. La estructura del mismo es:
Cuando se utiliza nohup, es obligado redireccionar tanto la salida como la salida de errores.
Si no se hace, el sistema los redirecciona al fichero nohup.out.
Un comando lanzado de manera habitual puede ser abortado mediante la tecla break o
interrupt. Sin embargo, este no puede realizarse con un comando lanzado en background.
Para interrumpir éstos, debe utilizarse el comando kill.
El comando kill se utiliza para abortar la ejecución de un proceso (de cualquier tipo de
proceso, si bien para los background es la única forma). La estructura es:
$ kill PID
donde PID es el identificador del proceso que desea abortarse. La necesidad de utilizar el PID
explica el que este número aparezca en pantalla cuando se lanza un proceso en background.
$ kill -9 PID
la cual garantiza la interrupción del proceso. Obviamente, un usuario sólo puede abortar
sus propios procesos, no los de los demás.
$ nice -6 PROC
El valor del código de retorno no se muestra directamente en pantalla, sino que se halla en la
variable ?. Por ello, para conocer el código de retorno de un proceso, haremos:
$ echo $?
Estos dos comandos únicamente tienen como función dar un valor al código de retorno. Su
verdadera utilidad podrá verse en capítulos posteriores.
Los argumentos sobre los que trabaja el comando test son ficheros, números enteros y
cadenas de caracteres. Las distintas evaluaciones que pueden llevarse a cabo actúan a modo
de opción.
Cuando los argumentos utilizados son ficheros, el comando test se utiliza para evaluar la
situación de los mismos. Las principales evaluaciones que pueden efectuarse son:
Así,
$ test –r file
provocaría un código de retorno 0 si el fichero file tiene permiso de lectura para el usuario.
En este caso, el comando se utiliza para determinar la veracidad de una expresión lógica. Las
evaluaciones que pueden efectuarse son:
Todas las evaluaciones vistas (tanto para ficheros, números o caracteres) pueden combinarse a
través de uniones and (-a) y or (-o). Es decir,
Asimismo,
8. FICHEROS DE COMANDOS
Ahora bien, normalmente los comandos necesitan argumentos sobre los que actuar. Así, por
ejemplo, podemos idear un fichero de comandos que asigna permisos a ficheros sin necesidad
de conocer el funcionamiento de chmod. Sin embargo, ese fichero sería prácticamente inútil
si no somos capaces de indicar en cada ocasión a qué fichero queremos cambiar los permisos.
Para salvar este tipo de problemas, los ficheros de comandos admiten argumentos (como si se
tratara de un comando normal). Los argumentos de los ficheros de comandos son
informaciones que el usuario aporte, y que serán manejadas convenientemente en el interior
del fichero de comandos.
Ahora bien ¿cómo se hace referencia internamente a los argumentos?. Se hace, teniendo en
cuenta su posición. Así, si en un fichero de comandos quiero manejar el primer argumento,
utilizaré el símbolo $1. $2 será el segundo argumento, y así sucesivamente, hasta un máximo
de 9. No se admiten más argumentos en un fichero de comandos. Sin embargo, es posible que
un determinando proceso necesite un mayor número de ellos. En este caso, puede utilizarse
DENTRO DEL FICHERO, el comando shift, cuya función es desplazar una posición los
argumentos. De esta forma, $3 pasa a ser $2, $2 pasa a ser $1, $10 pasa a ser $9, etc. $1
desaparecerá.
shift puede utilizarse con un argumento numérico, que indica cuántas posiciones deben
desplazarse los argumentos. Así,
$ shift 2
indica que los argumentos se desplazan dos posiciones, por lo que $3 pasaría a ser $1, $4
pasaría a ser $2, y los argumentos $1 y $2 desaparecen.
Además de los símbolos que indican los argumentos, existen otros que tienen un significado
especial dentro de un fichero de comandos:
read VAR1
read V1 V2
En este caso, la variable V1 tomaría el valor Al mientras que la variable V2, tomaría el valor
A2 A3.
Si la respuesta es
A1
Debe tenerse en cuenta que el comando read no lanza ningún mensaje a pantalla, por lo que
es habitual utilizar delante de un read un comando echo, que indique al usuario qué
información se le está pidiendo.
Por último, hay que indicar que un fichero de comandos en ejecución define un nuevo shell,
es como si previamente se ejecutara sh. Por ello, las variables que se definan en el interior del
fichero de comandos no afectarán a las ya existentes en el shell (aunque sean de entorno), y al
finalizar la ejecución, no quedará constancia de ellas.
$ sh –x fich
De esta forma, el fichero se ejecutará de forma que antes de ejecutarse cada comando, se
escribirá en pantalla el nombre del comando a ejecutar. Con ello, es más fácil controlar el
funcionamiento del programa.
Se puede dar un argumento a exit, un número comprendido entre 0 y 255. En este caso, el
código de retorno adopta ese valor.
8.4.1 La construcción if
if
CMD1
then
CMDA
CMDB
fi
si
el código de retorno de CMD1 es 0
entonces
Se puede incluir una construcción if dentro de otra. En este caso, las distintas construcciones
deben cerrarse en orden inverso a como han sido abiertas.
Si entre if y then existen varios procesos, se ejecutarán todos ellos, pero sólo el código de
retorno del último marcará la decisión.
if
CMD1
then
CMDA
CMDB
else
CMDC
CMDD
si
el código de retorno de CMD1 es 0
entonces,
se ejecutan CMDA, CMDB
si no,
se ejecutan CMDC, CMDD
if
CMD1
then
CMDA
CMDB
elif
CMD2
then
CMDC
CMDD
fi
Y su lectura es:
si
$ if
>
El símbolo > indica que la construcción no está completa. Por tanto, el terminal seguirá
esperando la introducción de órdenes hasta que se llegue al fi, momento en el que volverá a
aparecer el prompt ($), pues se ha completado la construcción. En ese instante se ejecuta toda
la construcción.
Al símbolo > se le denomina segundo prompt y su valor reside en la variable PS2, por lo que
puede ser modificado a voluntad del usuario.
while
CMD1
do
CDMA
CMDB
done
mientras
el código de retorno de CMD1 sea 0
se ejecutan los comandos CMDA, CMDB, comprendidos entre do y
done.
Obviamente, si CMD1 es true, puede establecerse un ciclo sin fin. Al igual que en la
construcción if (y como sucederá en las posteriores construcciones) puede incluirse una
construcción while dentro de otra, debiendo cerrarse de forma inversa a como han sido
abiertas.
El comando break se utiliza para finalizar un ciclo de forma prematura, sin que éste llegue a
su fin. Así supongamos la siguiente estructura:
while
CMD1
do
CMDA
CMDB
while
CMDC
do
CMDE
break
done
CMDJ
CMDK
done
CMDX
break puede llevar un argumento numérico, que indica cuántos ciclos do-done (incluidos
uno dentro de otro) deben saltarse para continuar la ejecución. Así, si en lugar de break en
el ejemplo anterior apareciera
break 2
El comando continue funciona de forma similar. Cuando se halla dentro de un ciclo do-
done, interrumpe la ejecución del ciclo pero vuelve a ejecutar el proceso que condiciona la
ejecución del mismo. Así, si en el ejemplo anterior apareciera
el fichero de comandos volvería a ejecutar CMDC, y podría volver a ejecutar el mismo ciclo,
en caso de que el código de retorno fuera 0. Al igual que break, continue puede llevar un
argumento numérico, indicando qué ciclo do-done (incluido uno dentro de otro) debe ser
evaluado.
Así, si en lugar de
Esta construcción es bastante similar a la while. Sirve también para generar un ciclo, pero
un número determinado de veces. La estructura es la siguiente:
Y su funcionamiento es el siguiente:
La variable V (una variable cualquiera) toma el valor char1 (puede ser un número, un
carácter o conjunto de caracteres o un fichero) y a continuación ejecuta todos los procesos
comprendidos entre do-done. A continuación, V torna el siguiente valor de la lista (char2)
y vuelve a repetirse el proceso, y así continúa hasta que V toma el último valor. De esta forma
se crea un ciclo que se ejecutará un determinado número de veces.
Esta construcción es equivalente a un if múltiple. Todo lo que puede hacerse con case,
puede obtenerse mediante varios if. La estructura es:
case CHAR in
modelo 1) (delimitador de modelo)
CMD1
;; (fin de modelo)
modelo 2)
CMD2
;;
modelo n)
CMDN
;;
esac (fin de case, esac es case al revés)
El funcionamiento es el siguiente:
Se compara la cadena CHAR (normalmente será el contenido de una variable) con modelos. Si
coincide, se ejecutan los procesos siguientes hasta el símbolo ;;. Se compara con modelo2,
y se va repitiendo la operación hasta llegar al final.