xargs: использование одного и того же аргумента в нескольких командах

17

Я пытаюсь написать однострочную строку, которая может проверять вывод df -hи оповещать, когда на одном из разделов заканчивается [или почти] свободное место. Это та часть, которая использует xargs, которая пинает меня в задницу сейчас ...

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

Как я могу сделать второе {} шоу "95" тоже?

nemesisfixx
источник

Ответы:

23

Это &&не часть 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.

ckhan
источник
3

Альтернативный способ, который является более читабельным, состоит в том, чтобы определить отдельную функцию, которая содержит все остальные ваши команды, а затем вызвать эту функцию с 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"'
shivams
источник