眼镜
操作系统:OS X;客户端:终端;外壳:sh、bash
问题
我正在编写一个 shell 脚本,为命令添加一个抽象层ls
。我想让它“牢不可破”,所以我首先找出ls
可以接受的每个可能的命令(通过 [ls(1) - Linux 手册页][1]),这样我就可以对传递的选项执行另一层验证/控制通过命令行。
在深入研究我的脚本之前,我决定看看ls
某些长选项(双连字符)的正常功能是什么。我尝试了其中的一些方法,但每一种都以某种方式失败了。例如运行的输出ls --ignore-backups
为:
<dir> <username>$ ls --ignore-backups
ls: illegal option -- -
usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]
无论我是通过 sh 还是 bash 运行,上面的内容都是相同的(我知道这对于更有经验的用户来说应该是显而易见的)。
此时,我运行了,这表明我的机器上man ls
的版本仅接受单字母选项。ls
问题
- 我如何才能使我的脚本具有通用性?
- 一般来说,当将命令行参数传递给底层 UNIX/Linux 命令时,是否有一个公认的标准库作为工作的基础?
- 我是否缺少对 UNIX/Linux 命令库的一些基本了解?
注意:我对 shell 脚本编写比较陌生,不确定我是否提出了正确的问题。
答案1
如果您正在开发并针对 OS X,最好查看 OS Xls
手册页,而不是 Linux 手册页,并坚持其中记录的选项。
或者,如果您希望您的脚本在每个 Unix 实现上都“牢不可破”地工作,那么您或多或少就注定要失败。虽然有一组通用选项,但您会在所有实现中找到这些选项由 POSIX 定义,当然有许多非标准扩展,例如 GNU 双连字符扩展,但也有可能特定于ls
方言和/或操作系统的单字符选项。没有通用且可移植的方法来识别给定命令实现支持的选项。
答案2
如果您喜欢编写可移植脚本,请不要使用GNUisms
,例如long options
。
定义的选项POSIX
通常就足够了,大多数 GNU 长选项只是到处都可以使用的官方短选项的别名。