miércoles, 22 de febrero de 2017

Expresiones para archivo

Las siguientes expresiones se usan para evaluar el estado de los archivos.

Tabla 27-1: Expresiones test para archivos
Expresión Es verdadero si:
archivo1 -ef archivo2 archivo1 y archivo2 tienen los mismos números de inodo (los dos nombres de archivo se refieren al mismo archivo mediante enlace duro).
archivo1 -nt archivo2 archivo1 es más nuevo que archivo2.
archivo1 -ot archivo2 archivo1 es más antiguo que archivo2.
-b archivo archivo existe y es un archivo (de dispositivo) de bloques.
-c archivo archivo existe y es un archivo (de dispositivo) de caracteres.
-d archivo archivo existe y es un directorio.
-e archivo archivo existe.
-f archivo archivo existe y es un archivo normal.
-g archivo archivo existe y tiene activado el bit de identificación de grupo (setgid).
-G archivo archivo existe y su propietario es el ID de grupo efectivo.
-k archivo archivo existe y tiene activado su "sticky bit".
-L archivo archivo existe y es un enlace simbólico.
-O archivo archivo existe y su propietario es el ID de usuario efectivo.
-p archivo archivo existe y es una tubería (pipe) con nombre.
-r archivo archivo existe y es legible (tiene permisos de lectura para el usuario efectivo).
-s archivo archivo existe y tiene una longitud mayor que cero.
-S archivo archivo existe y es archivo de socket.
-t fd fd es un descritor de archivo dirigido a/desde el terminal. Puede usarse para determinar si se está redirigiendo la entrada/salida/error estándar.
-u archivo archivo existe y tiene activado el bit de identificación de usuario (setuid).
-w archivo archivo existe y es editable (tiene permisos de escritura para el usuario efectivo).
-x archivo archivo existe y es ejecutable (tiene permisos de ejecución/búsqueda para el usuario efectivo).

Aquí tenemos un script que demuestra algunas de las expresiones para archivo:

#!/bin/bash

# test-file: Evaluate the status of a file

FILE=~/.bashrc

if [ -e "$FILE" ]; then
     if [ -f "$FILE" ]; then
          echo "$FILE is a regular file."
     fi
     if [ -d "$FILE" ]; then
          echo "$FILE is a directory."
     fi
     if [ -r "$FILE" ]; then
          echo "$FILE is readable."
     fi
     if [ -w "$FILE" ]; then
          echo "$FILE is writable."
     fi
     if [ -x "$FILE" ]; then
          echo "$FILE is executable/searchable."
     fi
else
     echo "$FILE does not exist"
     exit 1
fi

exit

El script evalúa el archivo asignado a la constante FILE y muestra sus resultados a medida que se realiza la evaluación. Hay dos cosas interesantes a tener en cuenta sobre este script. Primero, fíjate cómo el parámetro $FILE está entrecomillado dentro de las expresiones. Esto no es obligatorio, pero es una defensa contra un parámetro vacío. Si la expansión de parámetros de $FILE fuera a dar como resultado un valor vacío, podría causar un error (los operadores serían interpretados como cadenas no nulas en lugar de como operadores). Usando las comillas alrededor de los parámetros nos aseguramos que el operador siempre está seguido por una cadena, incluso si la cadena está vacía. Segundo, fíjate en la presencia del comando exit cerca del final del script. El comando exit acepta un único, y opcional, argumento que se convierte en el estado de salida del script. Cuando no se le pasa ningún argumento, el estado de salida por defecto es la salida del último comando ejecutado. Usar exit de esta forma permite que el script indique el fallo si $FILE se expande en el nombre de un archivo inexistente. El comando exit que aparece en la última línea del script es una formalidad. Cuando un script "alcanza el final" (llega al final del archivo), termina con un estado de salida del último comando ejecutado por defecto.

De forma similar, las funciones de shell pueden devolver un estado de salida incluyendo un argumento entero al comando return. Si fuéramos a convertir el script anterior en una función de shell para incluirlo en un programa mayor, podríamos reemplazar los comandos exit con sentencias return y obtener el comportamiento deseado:

test_file () {

     # test-file: Evaluate the status of a file

     FILE=~/.bashrc

     if [ -e "$FILE" ]; then
          if [ -f "$FILE" ]; then
                echo "$FILE is a regular file."
          fi
          if [ -d "$FILE" ]; then
               echo "$FILE is a directory."
          fi
          if [ -r "$FILE" ]; then
               echo "$FILE is readable."
          fi
          if [ -w "$FILE" ]; then
               echo "$FILE is writable."
          fi
          if [ -x "$FILE" ]; then
               echo "$FILE is executable/searchable."
          fi
     else
          echo "$FILE does not exist"
          return 1
     fi

}

No hay comentarios:

Publicar un comentario