ls 的通用抽象

ls 的通用抽象

眼镜

操作系统: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 长选项只是到处都可以使用的官方短选项的别名。

相关内容