xargs: użycie tego samego argumentu w wielu poleceniach

17

Próbuję napisać linijkę, która może sondować wyjście df -hi ostrzegać, gdy jedna z partycji zabraknie [lub prawie] miejsca. To część wykorzystująca xargs, która teraz kopie mnie w tyłek ...

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

Jak mogę sprawić, aby drugi {} wyświetlał również „95”?

nemesisfixx
źródło

Odpowiedzi:

23

To &&nie jest część xargspolecenia, to całkowicie osobne wywołanie. Myślę, że będziesz chciał jawnie wykonać podpowłokę:

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

Zauważ też, że używam _percentzamiast, {}aby uniknąć dodatkowych cytatów związanych z bólem głowy. To nie jest zmienna powłoki; wciąż tylko ciąg zastępczy xargs.

ckhan
źródło
3

Alternatywnym sposobem, który jest bardziej czytelny, jest zdefiniowanie oddzielnej funkcji, która zawiera wszystkie pozostałe polecenia, a następnie wywołanie tej funkcji xargsw podpowłoce.

Stąd na przykład:

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
źródło