xargs: utiliser le même argument dans plusieurs commandes

17

J'essaie d'écrire un one-liner qui peut sonder la sortie de df -het alerter lorsque l'une des partitions est hors [ou presque] d'espace. C'est la partie utilisant des xargs qui me donne des coups de pied dans le cul maintenant ...

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

Comment faire pour que le deuxième {} affiche "95" aussi?

nemesisfixx
la source

Réponses:

23

Cela &&ne fait pas partie de la xargscommande, c'est une invocation complètement distincte. Je pense que vous voudrez exécuter explicitement un sous-shell:

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

Notez également que j'utilise _percentau lieu de {}pour éviter de citer des maux de tête supplémentaires avec le shell. Ce n'est pas une variable shell; toujours juste une chaîne de remplacement xargs.

ckhan
la source
3

Une autre manière, plus lisible, consiste à définir une fonction distincte qui contient toutes vos autres commandes, puis à appeler cette fonction avec xargsdans un sous-shell.

Par conséquent, par exemple:

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
la source