什么时候编写可移植脚本很重要?


18

我写的大多数代码都在PHP中。我最近开始学习Shell脚本。我遇到的大多数资源和教程都是针对Bash的。有些警告关于洗礼,有些则没有。我在这里和Stack Overflow上已经读了很多东西。

每当答案使用Bashisms时,不可避免地会有人评论说:

您不应该使用<在此处插入bashism>。它不是便携式的。

即使将问题标记为,也会发生这种情况bash。对我来说,这就像告诉一个PHP程序员,他们不应该使用PHP 5中的新代码,因为它不能与PHP 4一起使用。或者告诉某人,他们不应该为Mac写一些东西,因为它不能被使用。在Windows上。

当我用PHP编写时,我选择了最低要求,并编写了向前兼容的代码。我不担心使其向后兼容。

如果我使用#!/bin/bashshebang,为什么不使用bashisms?我开始得到的印象是有些人就是喜欢bash的 bash化(双关语意)只是为了它的缘故。

人们经常使用bash并且shell可以互换使用-可能是由于bash是许多系统上的默认shell。因此,我可以理解添加注释以警告该代码使用了bashisms,但我不明白使用它们的含义是错误的

显然,如果我编写的脚本严格仅供个人使用,则可以用我想要的任何语言编写。但我想认为我编写的某些代码可能对其他人有用。

发布前,我尝试过寻找问题的答案。我发现了很多有关如何测试可移植性的信息,但是找不到什么时候进行此操作很重要

那么,什么时候编写可移植脚本很重要?

例如,

  • 哪种类型的脚本应尽可能地可移植?
  • 没有安装Bash的系统有多普遍?
  • 如果系统已安装Bash,它还会具有GNU版本的find和其他实用程序吗?

4
我对这个问题进行了投票并回答了这个问题,但是我想得越多,只有最后两个问题适合该网站。其他人“主要基于意见”。
jordanm 2014年

1
这个问题还有一个元方面:虽然可能无法帮助问题的初次回答,但诸如“ this is not Portable”之类的评论对其他读者在数月或数年后陷入该问题/答案的绊脚石可能非常有帮助。
Bananguin 2014年

2
@Bananguin评论说“这不是可移植的”不会打扰我。仅供参考。我自己做了这些类型的评论。是“您不应该使用...”困扰着我。这意味着答案有问题。例如,如果答案是推荐不建议使用的代码,那将是有效的。因此,我想知道Bash有什么问题。
toxalot

2
+1。尤其是当问题bash仅带有标签时,有人会评论“这是bashism且不可移植”。当我回答带有标记的问题时C,我不在乎它是否可移植Java
PP

4
我觉得最好指出它是一个bash特定功能,而不是可移植的,就像我要指出的是,某些实用程序正在使用GNU特定扩展名(即使该问题被标记为Linux)。我从未见过有人说“这是一种bashism,并且您永远不应该使用它”。
马丁·图尔诺伊

Answers:


15

作为这个社区的成员,我很少看到人们因为针对bash的事情而忽视bashisms。当谈到可移植性时,GNUism比bashism差得多。只要bash用于shebang,就可以期望使用来执行脚本bash。但是,除非明确检查,否则不能保证版本。Bash版本4带来了一些有用的功能,例如关联数组,但是Bash v3仍然在OS X和RHEL 5上广泛使用。

哪种类型的脚本应尽可能地可移植?

这更多地是关于您的需求以及您作为开发者所选择支持的内容。如果您正在为支持所有* NIX类型的应用程序编写安装脚本,那么可移植性将非常重要。

没有安装Bash的系统有多普遍?

FreeBSD和Solaris 10是默认情况下未安装bash的系统的示例。除嵌入式系统外,大多数Linux系统都将具有它。

如果系统已安装Bash,它还会具有GNU版本的find和其他实用程序吗?

不,这是可移植性的真正问题。如果可移植性很重要,则应仅使用POSIX标准定义的shell命令功能。GNU实用程序可以安装在非GNU系统(例如FreeBSD)上,但是它们不太可能出现在PATH中,因此您不能依靠这些工具来安装。


1
我认为这更多的是SO,而不是在这里我经常看到人们无视bashisms。我只知道,我经常注意到它,足以使我感到沮丧,并促使我提出这个问题。
toxalot

1
因此,如果安装了GNU实用程序但未在PATH中首先安装它,是否有一种方法可以专门调用它们?否则,为什么要安装它们呢?
toxalot

@toxalot:使用绝对路径显式调用二进制文件和脚本。
Bananguin 2014年

1
@Bananguin因此,如果有人安装了Bash和GNU实用程序(但不在PATH中),那么他们可以编辑该脚本以使用绝对路径来使用该脚本,find以及我使用过的其他任何GNU特定实用程序?显然,这对于安装程序脚本不是用户友好的。但是我正在考虑将一些东西放到GitHub上,以供其他人按需获取。我不在乎它不是可移植到每个系统的。我只是不希望它在许多系统上都没有
toxalot

1
@toxalot:是的,可以工作。如果FIND=/opt/gnu/dispicable/bin/find在脚本的开头放置类似的内容,然后在脚本中使用${FIND}而不是,则find给人们一个(!)位置,以放置他们的安装路径,并使脚本使用正确的工具。
Bananguin 2014年

5

那么,什么时候编写可移植脚本很重要?

哪种类型的脚本应尽可能地可移植?

当您将它们用于您的工作环境时,并且您(或将来可能)在不同的机器上工作-并且,您无需在开始工作之前就必须重写工具。

例如:垃圾脚本/ rm替换


马克·斯图尔特:

...对于我的疑难解答工具包,我假设我只有vi和Korn Shell。我尝试使用适用于大多数Unix版本的命令。


3
我喜欢一些漂亮的“ Bash-isms”,但是对于我的故障排除工具包,我假设我只有vi和Korn Shell。我尝试使用适用于大多数Unix版本的命令。这样,我就可以在有病的系统上进行分类了,而不必担心ps命令的行为如何,是否存在Bash或Perl或PHP,或者它们在哪里。
马克·斯图尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.