web-dev-qa-db-ja.com

xargs:複数のコマンドで同じ引数を使用する

df -hの出力をプローブして、パーティションの1つが[またはほとんど]領域を超えたときに警告できるワンライナーを作成しようとしています。 xargsを使用しているので、今はお尻を蹴っている...

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

2番目の{}にも「95」を表示するにはどうすればよいですか?

18
nemesisfixx

その&&xargsコマンドの一部ではなく、完全に別の呼び出しです。サブシェルを明示的に実行する必要があると思います。

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

また、シェルでの余分な引用頭痛を避けるために、_percentではなく{}を使用していることにも注意してください。これはシェル変数ではありません。まだxargs置換文字列だけです。

24
ckhan

より読みやすい別の方法は、他のすべてのコマンドを含む個別の関数を定義し、サブシェルでxargsを使用してその関数を呼び出すことです。

したがって、たとえば:

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"'
3
shivams