xargs: usando o mesmo argumento em vários comandos

15
Estou tentando escrever um one-liner que pode investigar a saída de df -h e alertar quando uma das partições está fora ou quase do espaço. É a parte que usa xargs que me chutam 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?

    
por nemesisfixx 26.11.2012 / 12:25

2 respostas

21

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

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

Note também que estou usando _percent em vez de {} para evitar dores de cabeça adicionais com o shell. Não é uma variável shell; ainda é apenas uma string de substituição de xargs.

    
por 26.11.2012 / 13:15
2

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

Por isso, 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"'
    
por 22.07.2015 / 12:39