仅覆盖您问题的1)。
自然,API总是可以随时根据其创建者的意愿进行更改,从而以任何语言破坏依赖的软件。就是说,Unix工具的I / O “ API” 的好主意是几乎没有(可能0x0a
是行尾)。一个好的脚本可以使用Unix工具过滤数据,而不是创建数据。这意味着您的脚本可能会因输入或输出规范发生更改而中断,而不是因为脚本中使用的各个工具的I / O格式(同样,实际上没有一种)发生更改(因为某些内容实际上并不存在)无法真正改变)。
通过基本工具列表,我很少将属性归为producer,这与仅使用filter相对:
- wc-打印字节,单词,行数- 非常简单的格式,因此绝对不可能更改,而且不太可能在脚本中使用。
- 差异 -已经发展出不同的输出格式,但我还没有听说过任何问题。通常也不会在没有监督的情况下使用。
- 日期 -现在,我们在这里确实必须注意产生的内容,尤其是在系统区域设置方面。但是,如果您自己不完全指定输出格式,则输出格式为RFC。
- cal-不用说了,我知道不同系统的输出格式确实有很大的不同。
- ls,谁,w,最后 -如果您想解析ls,我无济于事,这不是本来就应该的。还有,谁是最有互动性的列表发布者?如果在脚本中使用它们,则必须注意所做的事情。
- 在另一篇文章中指出了时间。但是,是的,和ls一样。更多用于交互式/本地使用。bash内置函数与GNU版本有很大不同,并且GNU版本多年来一直存在未修复的错误。只是不要依赖它。
以下是期望特定输入格式比字节流更具体的工具:
- BC,DC-计算器。事情已经变得更加骇人听闻了(确实,我没有在脚本中使用它们),并且可能是非常稳定的I / O格式。
还有另一个发生破损风险更高的区域,即命令行界面。大多数工具在整个系统和整个时间表上都有不同的功能。例子是
- 使用regex的所有工具 -regex可以根据系统区域设置(例如LC_COLLATE)更改含义,并且在regex实现中存在许多细微差别。
- 根本不使用花哨的开关。您可以轻松地使用
man 1p find
例如读取POSIX查找手册页而不是系统手册页。在我的系统上,我需要安装manpages-posix。
而且即使使用这种开关,通常也不会巧妙地引入错误并污染您的数据。大多数程序只会拒绝使用未知开关。
总而言之,我想说shell实际上有可能成为最可移植的语言之一(当您可移植地编写脚本时,它是可移植的)。与发生细微错误的您喜欢的脚本语言进行比较,或者与您愿意放弃的喜欢的已编译程序进行比较。
此外,在极少数情况下,由于不兼容而可能发生破损,这可能不是由于时间所致,而是由于不同系统之间的多样性(这意味着如果它对您有用,那么它将在20年前实现,并将在20年后实现)。 )。这是工具简单性的必然结果。