Pregunta

Ejemplo:

#!/bin/sh

a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}

r=`a`
echo $r

$r contiene t o f sino también la salida del comando ls.

Puedo escribir ls -1 a* >/dev/null 2>/dev/null, pero si hay un guión más complejo que puede dar lugar a errores.

¿Hay alguna manera de devolver un solo valor de a()?

¿Fue útil?

Solución

función Shell A puede devolver un valor numérico. Considere 0 y 1 en lugar de 'f' y 't'

#!/bin/sh

a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}

a
r=$?
echo $r

Esta es la salida de la escritura todavía ls -1 a* la que es probable que todavía quiere desechar, pero el valor de r será 0 o 1 y no incluir la salida.

Los otros ejemplos de cómo redirigir la salida ya sea desde una línea o un bloque entero son buenas, y, como otros sugirieron, que debe llegar a conocer otras maneras de probar para las condiciones (pero yo estaba asumiendo el ls era una especie de un ejemplo arbitrario )

Otros consejos

usted no tiene que utilizar ls para comprobar si hay archivos que comienzan con a. Sólo tiene que utilizar la cáscara

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}

Se puede poner un cambio de dirección en una lista de comandos:

{
  command1
  command2
} >/dev/null

Si en algún momento de la secuencia de comandos no desea ninguna salida de los comandos siguientes, puede redirigir la salida de la cáscara con la orden interna exec:

echo interesting
exec >/dev/null
echo boring

Tenga en cuenta que esto dura hasta el final de la secuencia de comandos, no sólo hasta el final de una función. Este se encarga de comandos después de la interesante pero no antes.

Hay una manera de revertir el efecto de exec /dev/null, mediante el uso de manipulaciones de descriptor de archivo. No necesariamente lo recomiendo sin embargo, debido a que puede ser difícil de resolver en la práctica. La idea es reubicar a lo que se conecte a la salida estándar a un descriptor diferente, a continuación, redirigir la salida estándar a un archivo diferente, y, finalmente, la ubicación de la vuelta de salida estándar original en la salida estándar.

{
  exec 3>&1         # duplicate fd 3 to fd 1 (standard output)
  exec >/dev/null   # connect standard output to /dev/null
  echo boring
  exec 1>&3         # connect standard output back to what was saved in fd 3
  echo interesting
  exec >/dev/null   # connect standard output to /dev/null again
  echo more boring
} 3>/dev/null       # The braced list must have its fd 3 connected somewhere,
                    # even though nothing will actually be written to it.
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

Considere el uso de [-f nombre de archivo] y otras pruebas de archivos también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top