如何测试rm的GNU或BSD版本?

时间:2011-07-26 17:56:07

标签: bash shell gnu bsd

rm的GNU版本有一个很酷的-I标志。从联机帮助页:

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

Macs不要

$ 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 个答案:

答案 0 :(得分:6)

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

如果$?是0,它是coreutils

答案 1 :(得分:5)

我建议不要开始这条路。将脚本定位为尽可能可移植,并且只依赖于您可以依赖的标志/选项/行为。 Shell脚本很难 - 为什么要添加更多错误空间?

要了解我的想法,请查看Ryan Tomayko's Shell Haters talk。他还有一个组织良好的页面,其中包含POSIX descriptions of shell features and utilities的链接。例如,这里是rm

答案 2 :(得分:4)

你总是可以通过--version向rm询问其版本,并检查它是否显示 gnu coreutils

rm --version 2>&1 | grep -i gnu &> /dev/null
[ $? -eq 0 ] && alias rm="rm -I"

答案 3 :(得分:3)

我会说在临时文件上测试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

答案 4 :(得分:0)

这样的事情怎么样?

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