测试命令是否采用选项的首选方法是什么?有什么注意事项?
作为一个激励示例,在登录时,我的 shell 别名 grep 添加了几个 --exclude-dir 选项,但此选项并非在我访问的所有计算机上都可用。
答案1
幸运的是,有一种相对标准化的方法来向程序报告潜在的选项。然而,它并不总是被使用,所以这不是一个万无一失的答案;只是一个高级用户验证的答案。
$prog --help | grep -e "\b$option\b"
(注意,\b表示单词边界。也就是说,$option之后不会留下任何字符,因此$option-f将不匹配)
这将返回该选项(如果存在),但更重要的是,如果存在,则返回退出状态 0,如果不存在,则返回退出状态 1。您可以使用以下方法进行测试:
$ # we pipe to /dev/null to hide the output, and show that it doesn't matter
$ grep --help | grep -e "\b--exclude-dir\b" > /dev/null
$ echo $?
0
$ grep --help | grep -e "\b--exclude-dirf\b" > /dev/null
$ echo $?
1
这适用于许多程序,但不适用于全部有一个 --help 那是...有帮助的。您可能也有幸
man $progr | grep -e "\b$option\b"
如果第一次失败
答案2
您可以对虚拟数据进行测试,当且仅当该选项可用并且按预期工作时,该测试才会成功:
trap 'if [ -e "$tmp" ]; then rm -rf -- "$tmp"; fi' EXIT
tmp="$(mktemp -d)"
cd -- "$tmp"
mkdir exclude
mkdir include
echo foo > include/test.txt
echo foo > exclude/test.txt
[ "$(grep --exclude-dir exclude --recursive foo . | wc -l)" -eq 1 ]
答案3
鉴于大多数(所有?)命令在使用未知选项调用时退出时返回代码大于零,您可以尝试
cmd --option-to-probe [other options and parameters] >/dev/null 2>/dev/null
并检查是否$?
为0。
答案4
您可以 grep 命令的手册页来查看该选项是否存在,如下所示:
CMD=grep
OPTIONS=""
for OPT in "--exclude-dir" "--text" "--not_an_option"; do
if man $CMD | col -bx | egrep --quiet \\$OPT; then
OPTIONS="$OPTIONS $OPT"
fi
done
alias $CMD="$CMD $OPTIONS"