xargs: usando el mismo argumento en múltiples comandos

17

Estoy tratando de escribir una línea que pueda sondear la salida df -hy alertar cuando una de las particiones está fuera [o casi] de espacio. Es la parte que usa xargs lo que me patea el culo ahora ...

echo 95 | xargs -n1 -I{} [ {} -ge 95 ] && echo "No Space on disk {}% full -- remove old backups please"

¿Cómo puedo hacer que la segunda {} muestra "95" también?

nemesisfixx
fuente

Respuestas:

23

Eso &&no es parte del xargscomando, es una invocación completamente separada. Creo que querrás ejecutar explícitamente una subshell:

echo 95 | xargs -n1 -I_percent -- sh -c '[ _percent -ge 95 ] && echo "No Space on disk _percent% full -- remove old backups please"'

Tenga en cuenta también que estoy usando en _percentlugar de {}evitar dolores de cabeza de citas adicionales con el shell. No es una variable de shell; sigue siendo solo una cadena de reemplazo de xargs.

ckhan
fuente
3

Una forma alternativa, que es más legible, es definir una función separada que contenga todos sus otros comandos y luego llamar a esa función con xargsun subconjunto.

Por lo tanto, por ejemplo:

myfunc(){
  [ "$1" -ge 95 ] && echo "No Space on disk $1% full -- remove old backups please"
  echo "Another command echoing $1"
}

export -f myfunc

echo 95 | xargs -n1 -I_percent -- sh -c 'myfunc "_percent"'
shivams
fuente