测试命令是否接受特定选项

Pra*_*tic 3 grep options shell-script portability

测试命令是否采用选项的首选方法是什么?有哪些注意事项?

作为一个激励示例,在登录时,我的 shell 别名 grep 以添加几个 --exclude-dir 选项,但此选项并非在我访问的所有机器上都可用。

Tra*_*vis 5

幸运的是,有一种相对标准化的方法可以向程序报告潜在的选项。然而,它并不总是被使用,所以这不是一个万无一失的答案;只是一个超级用户证明的答案。

$prog --help | grep -e "\b$option\b"
Run Code Online (Sandbox Code Playgroud)

(注意,\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
Run Code Online (Sandbox Code Playgroud)

这将适用于许多程序,但并非所有程序都有一个 --help 是...有用的。你可能也有幸

man $progr | grep -e "\b$option\b"
Run Code Online (Sandbox Code Playgroud)

如果第一个失败