Centro de Informática
Sistemas Operativos II (UNIX)

Examen Diciembre 1997

Resolución

PARTE I. Sin consulta de material.

1. ¿Para qué sirve el operador grave?
Para ejecutar un comando dentro de otro comando; un uso común es ejecutar un comando y colocar su salida en una variable de ambiente.
2. Al escribir comandos, ¿qué diferencia hay entre usar comillas dobles y simples?
Lo que está dentro de las comillas dobles es interpretado por el shell. Las variables de ambiente, el asterisco, etc., son expandidos a sus valores. Lo que está dentro de comillas simples no es interpretado en modo alguno; son los caracteres escritos y nada más.
3. Ejecutar el comando nodigo de modo que no produzca ninguna salida ni muestre ningún error.
nodigo 1>/dev/null 2>&1
4. ¿Qué son los procesos? ¿Qué son las señales?
Un proceso es un programa en ejecución. Las señales son valores que se hacen llegar a los procesos para controlarlos mientras se están ejecutando.
5. ¿Qué son BSD y SYSTEM V? ¿Qué es POSIX?
BSD y SYSTEM V son dos líneas diferentes de desarrollo de los sistemas operativos UNIX. POSIX es un estándar que se pretende que cumpla todo sistema operativo que desee llamarse UNIX.
6. ¿Puede haber un enlace hard hacia un directorio? ¿Puede haber un enlace simbólico hacia un directorio? ¿Qué diferencia hay?
No puede haber enlace hard hacia directorio; sí puede haber enlace simbólico hacia directorio. El enlace hard es sólo una referencia más hacia el archivo; el enlace simbólico es un pequeño archivo que contiene un puntero hacia el archivo real. Cada enlace simbólico genera un nuevo pequeño archivo; los enlaces hard no generan nuevos archivos.
7. ¿Con qué comando se borra un archivo? ¿Y un directorio? ¿Con qué comando se borra un enlace simbólico hacia un archivo? ¿Con qué comando se borra un enlace simbólico hacia un directorio?
Un archivo se borra con rm; un directorio se borra con rmdir; un enlace simbólico se borra con rm, sea a directorio o a archivo, ya que un enlace simbólico es en definitiva un archivo.
8. ¿Qué es el "shell"? ¿Qué hace? En un mismo sistema UNIX, ¿puede haber más de un shell? Explicar.
El shell es el intérprete de comandos, que recibe los comandos del operador, los interpreta y los transfiere al núcleo o "kernel" del sistema operativo. En un mismo sistema puede haber más de un shell; cada usuario puede tener uno diferente, e incluso un mismo usuario puede invocar un shell diferente del que está atendiendo su sesión actual.
9. Escribir un comando y uno solo para ejecutar cada una de las siguientes tareas, en el directorio actual:
- crear directorios trab1, trab2, trab3;
- asignar los tres directorios al usuario gerente;
- asignar los tres directorios al grupo trabajos;
- fijarles permiso total para el usuario y el grupo, pero sólo lectura y recorrido para otros.
mkdir trab1 trab2 trab3
chown gerente trab?
chgrp trabajos trab?
chmod 775 trab?
10. Escribir un comando (uno solo) para ejecutar cada una de las tareas siguientes en los directorios trab1, trab2 y trab3 del directorio actual, en forma simultánea:
- crear en los tres directorios archivos resumen.txt.
- crear en los tres directorios enlaces simbólicos tmp hacia el directorio /tmp.
- crear en los tres directorios archivos 00indice con fecha y hora actuales.
- agregar a los tres archivos 00indice la leyenda "Montevideo, URUGUAY".
- eliminar en los tres directorios los subdirectorios basura y todos los archivos y subdirectorios bajo basura.
 
touch trab?/resumen.txt
ln -s /tmp trab?/tmp
date > trab?/00indice
echo "Montevideo, URUGUAY" >> trab?/00indice
rm -r trab?/basura

PARTE II: Con libre consulta de material.

Escribir scripts para realizar las siguientes tareas.

1. Dado un archivo de texto cuyo nombre se recibe como parámetro, crear un archivo diccionario.txt que contenga todas las palabras de ese texto sin repetir, ordenadas y en mayúscula. Deberán extraerse del texto sólo las palabras, evitando símbolos y números.

  cat $1 | tr -cs "[a-zA-Z]" "\n" | tr [a-z] [A-Z] | \
  sort | uniq > diccionario.txt

2. Un archivo de registro de eventos en un sistema UNIX tiene en su primer campo el nombre del evento, en el campo 2 el nombre de login del usuario y en el campo 5 la cantidad de minutos en sesión; el separador de campos es ":". Escribir un script que reciba un nombre de login, extraiga los registros del evento "login" del usuario indicado, y calcule el total de minutos en sesión de ese usuario. El archivo de registro es /var/log/events.log. Si el usuario no tiene ningún login, deberá dar un mensaje adecuado.

  cat /var/log/events.log | grep login | grep $1 > logusu.tmp
 
  if [ ! -s logusu.tmp ] # si logusu.tmp no tiene tamaño >0
  then
    echo "El usuario $1 no tiene login"
    exit
  fi
 
  MINUTOS=`cat logusu.tmp | cut -f5 -d:`
  TOTAL=0
 
  for MIN in $MINUTOS
  do
    TOTAL=`expr $TOTAL + $MIN`
  done
  echo "El usuario $1 tiene $TOTAL minutos de login"

3. Usando el archivo /etc/group, escribir un script que reciba el nombre de un grupo como parámetro y presente el número de grupo, el nombre del grupo, la lista de usuarios y la cantidad de usuarios.

  GRUPO=`cat /etc/group | grep ^$1`
  echo "Nombre grupo:" `echo $GRUPO | cut -f1 -d:`
  echo "Número grupo:" `echo $GRUPO | cut -f3 -d:`
  echo "Lista de Usuarios:" `echo $GRUPO | cut -f4 -d:`
  echo "Cantidad de usuarios" `echo $GRUPO | tr "," " " | wc -w`

4. Escribir un script que reciba el nombre de un directorio como parámetro, verifique que existe y que es un directorio, determine si está ya contenido en la variable PATH, y si no está lo agregue; en ambos casos emitirá un mensaje indicando la condición y mostrará el contenido de la variable PATH.

  DIR=$1
  if [ ! -d $DIR ]
  then
    echo $DIR no existe o no es un directorio
    exit
  fi
  ESTA=`echo $PATH | grep $DIR`
  if [ -z $ESTA ] # $ESTA es vacío, $DIR no está en $PATH
  then
    PATH=$PATH:$DIR
    echo $DIR fue agregado a la variable PATH
  else
    echo $DIR ya se encuentra en la variable PATH
  fi
  echo PATH=$PATH