Не существует стандартного способа определить, является ли запущенный вами xargs GNU или нет. Я устанавливаю $gnuargs
в «true» или «false», а затем имею функцию, которая заменяет xargs и делает правильные вещи.
В Linux, FreeBSD и MacOS этот скрипт работает для меня. Стандарт POSIX для xargs требует, чтобы команда выполнялась один раз, даже если аргументов нет. FreeBSD и MacOS X нарушают это правило, поэтому не нуждаются в «-r». GNU находит это раздражающим и добавляет -r
. Этот скрипт работает правильно и может быть улучшен, если вы найдете версию Unix, которая делает это другим способом.
#!/bin/bash
gnuxargs=$(xargs --version 2>&1 |grep -s GNU >/dev/null && echo true || echo false)
function portable_xargs_r() {
if $gnuxargs ; then
cat - | xargs -r """$@"""
else
cat - | xargs """$@"""
fi
}
echo 'this' > foo
echo '=== Expect one line'
cat foo | portable_xargs_r echo "content: "
echo '=== DONE.'
cat </dev/null > foo
echo '=== Expect zero lines'
cat foo | portable_xargs_r echo "content: "
echo '=== DONE.'