xargs: usando o mesmo argumento em vários comandos

17

Estou tentando escrever uma linha que possa investigar a saída df -he alertar quando uma das partições estiver sem espaço (ou quase). É a parte usando xargs que me chuta na bunda agora ...

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

Como posso fazer o segundo {} mostrar "95" também?

nemesisfixx
fonte

Respostas:

23

Isso &&não faz parte do xargscomando, é uma invocação completamente separada. Eu acho que você vai querer executar explicitamente um subshell:

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

Observe também que estou usando, em _percentvez de, {}para evitar dores de cabeça adicionais com o shell. Não é uma variável de shell; ainda apenas uma sequência de substituição xargs.

ckhan
fonte
3

Uma maneira alternativa, que é mais legível, é definir uma função separada que contenha todos os seus outros comandos e depois chamar essa função xargsem um sub-shell.

Portanto, por exemplo:

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
fonte