Capturar error de comando y imprimir uno propio

Nucklear

Buenas, estaba haciendo un script para recolectar unos datos de unos archivos, el script hace todo lo que quiero sin problema, pero tiene un problema.

Esta línea me busca todos los archivos con extensión .pid:

PID_FILE=$(ls $PROFILES_PATH*/*/*/*.pid )

Y esos archivos existen si mi servidor está iniciado, en caso de que que no lo esté, al no encontrar ningún archivo me devuelve el siguiente error:

ls: *.pid: No such file or directory

Como yo se que eso depende de del servidor quiero capturar el stderr y imprimir un error personalizado.

He probado a redireccionarlo a /dev/null pero no consigo hacer lo que quiero.

¿Alguna ayuda?

PD: No me mateis por usar ls así :qq:

DiSKuN

#1 con un

if [ $? -ne 2 ]; then

con $? capturas lo que te devuelve la consola al hacer el ls,y lo comparamos con el 2 que es el stderr.

Eso si, lo tienes que poner justo después de que haga el ls

1 respuesta
Nucklear

#2 A ver que no me aclaro mucho, yo lo pongo tal que así:

PID_FILE=$(ls $PROFILES_PATH*/*/*/*.pid)
   if [ $? -ne 2 ]; then
      echo "The environment should be started."
   fi

Pero el programa detecte o no detecte un error del ls me imprime la parte de "The environment should be started."

1 respuesta
DiSKuN

#3 Perdón, me he equivocado xD

sería así:

if [ $? -eq 2 ]; then

-ne es "diferente de "

Lo que no entiendo es que si buscas ficheros .pid en un directorio, no uses el comando find o locate

1 respuesta
Nucklear

#4 A ver al principio puse un find pero iba lentísimo entonces probé el ls y me fue mas rápido. Ademas el ls me devuelve el path y mas tarde voy extrayendo el número que contiene cada archivo.

1 respuesta
DiSKuN

#5 find no devuelve el path? diria que si.
Igualmente puedes usar locate.

locate es más rápido porque almacena una pequeña base de datos con toda la estructura de ficheros del sistema. Solo se tiene que actualizar esa pequeña base de datos y asi tienes todo el disco indexado.

sudo updatedb #para indexar el disco
sudo locate <patron de búsqueda> #para que haga la búsqueda
1 respuesta
Nucklear

#6 ¿Entonces por ejemplo para mostrar los datos podría hacer algo así?

PID_FILE=$(ls $PROFILES_PATH*/*/*/*.pid)
   if [ $? -ne 2 ]; then
      echo "The environment should be started."
   fi

for x in $PID_FILE
do
   echo "$x >>> $(cat $x)"
done

Donde "x" sería el path absoluto del archivo .pid

EDIT: Acabo de probar y no me captura el error, de hecho, provocando el fallo me imprime "No such file or directory".

Debería primero enviar el error a /dev/null y luego imprimir mi error ¿no?

DiSKuN

Entiendo que no, tengo un script por aqui en el curro que hace una comparación similar y funciona guay xD

1 respuesta
Nucklear

#8 Pues no me funciona xD

He probado como está ahi arriba y me devuelve el error del comando :[

DiSKuN

mira lee, de mitad hacia abajo. Explica lo que hace $?

http://www.wikilearning.com/monografia/guia_de_shell_scripting_avanzado-variables_en_bash/5836-3

Usuarios habituales

  • DiSKuN
  • Nucklear