Как проверить версию GNU или BSD для rm? - PullRequest
5 голосов
/ 26 июля 2011

Версия GNU rm имеет классный флаг -I.С man-страницы:

-I     prompt once before removing more than three files, or when removing recursively.   Less
          intrusive than -i, while still giving protection against most mistakes

Mac не:

$ rm -I scratch
rm: illegal option -- I
usage: rm [-f | -i] [-dPRrvW] file ...
   unlink file

Иногда на Mac установлены люди coreutils (версия GNU), а иногда нет.Есть ли способ обнаружить этот флаг командной строки, прежде чем продолжить?Я хотел бы иметь что-то вроде этого в моем bash_profile:

if [ has_gnu_rm_version ]; then
    alias rm="rm -I"
fi

Ответы [ 5 ]

6 голосов
/ 27 июля 2011

strings /bin/rm | grep -q 'GNU coreutils'

если $? 0, это coreutils

5 голосов
/ 26 июля 2011

Я бы порекомендовал не начинать этот путь вообще.Сделайте так, чтобы ваши скрипты были максимально переносимыми и полагались только на флаги / опции / поведения, на которые вы можете рассчитывать.Сценарии оболочки достаточно сложны - зачем добавлять больше места для ошибок?

Чтобы понять, что я имею в виду, посмотрите * * * Shell Haters Райана Томайко talk .У него также есть очень хорошо организованная страница со ссылками на описания POSIX функций и утилит оболочки .Вот, например, rm .

4 голосов
/ 26 июля 2011

Вы всегда можете задать rm его версию с помощью --version и проверить, не написано ли gnu или coreutils , например:

rm --version 2>&1 | grep -i gnu &> /dev/null
[ $? -eq 0 ] && alias rm="rm -I"
3 голосов
/ 26 июля 2011

Я бы сказал, проверить вывод rm -I во временном файле, если он пройдет, используйте псевдоним

touch /tmp/my_core_util_check

if rm -I /tmp/my_core_util_check > /dev/null 2>&1 ; then
    alias rm="rm -I"
else
    rm /tmp/my_core_util_check;
fi
0 голосов
/ 26 июля 2011

как насчет этого?

#!/bin/bash
rm -I &> /dev/null
if [ "$?" == "0" ]; then
    echo coreutils detected
else
    echo bsd version detected
fi
...