Bash Unix shell之间的可移植性—我是否正确地考虑了这个问题?
每当我编写shell脚本(主要是软件开发实用程序或构建工具)时,我通常都会尽量避免使用bash,而使用普通的sh来实现可移植性。然而,最近我遇到了越来越多的问题,其中有用的功能不可用,或者使用sh的系统之间的行为实际上不如使用bash的系统一致,因为sh被别名为不同的shell 据我所知,sh是最古老的unixshell,精心编写的sh脚本理论上应该可以在任何系统上运行。。。但似乎每个主要外壳也有大约9000种不同的变体。使用bash作为脚本解释器是否有效地限制了脚本的可移植性?当然,在OSX或几乎所有的Linux上都没有问题,但是BSD呢?Solaris、AIX、HP-UX?如果你真的想什么都跑,你会怎么做 我知道bash几乎可以安装在任何操作系统上,但它真的是所有相关现代系统的一流公民吗?它是预装的吗?我只是不确定,为了获得最一致和可移植的总体体验,是否最好避免或接受bash 如果你真的想什么都跑,你会怎么做 您遵循(以及您正在调用的工具)并希望目标操作系统也这样做。任何称为“UNIX”的现代产品都必须遵循此标准,并且通常(尽管不是普遍)标准shell将被称为Bash Unix shell之间的可移植性—我是否正确地考虑了这个问题?,bash,shell,cross-platform,portability,sh,Bash,Shell,Cross Platform,Portability,Sh,每当我编写shell脚本(主要是软件开发实用程序或构建工具)时,我通常都会尽量避免使用bash,而使用普通的sh来实现可移植性。然而,最近我遇到了越来越多的问题,其中有用的功能不可用,或者使用sh的系统之间的行为实际上不如使用bash的系统一致,因为sh被别名为不同的shell 据我所知,sh是最古老的unixshell,精心编写的sh脚本理论上应该可以在任何系统上运行。。。但似乎每个主要外壳也有大约9000种不同的变体。使用bash作为脚本解释器是否有效地限制了脚本的可移植性?当然,在OSX或
/bin/sh
。BSD和Linux发行版也倾向于实现POSIX兼容性
如果你真的想什么都跑,你会怎么做
您遵循(以及您正在调用的工具)并希望目标操作系统也这样做。任何称为“UNIX”的现代产品都必须遵循此标准,并且通常(尽管不是普遍)标准shell将被称为/bin/sh
。BSD和Linux发行版也倾向于实现POSIX兼容性
使用bash作为脚本解释器是否有效地限制了脚本的可移植性
是的,但正如你所说,这取决于你的目标受众。如果它是一个简短的脚本,那么值得在dash
(Ubuntu和Debian的默认shell)下测试POSIX兼容性
每当我开始考虑shell脚本中的可移植性问题时,我就会切换到另一种语言。Perl广泛可用,通常是脚本的好选择,但如果Python、Ruby、$lang开发人员使用您的工具,请充分利用$lang
使用bash作为脚本解释器是否有效地限制了脚本的可移植性
是的,但正如你所说,这取决于你的目标受众。如果它是一个简短的脚本,那么值得在dash
(Ubuntu和Debian的默认shell)下测试POSIX兼容性
每当我开始考虑shell脚本中的可移植性问题时,我就会切换到另一种语言。Perl广泛可用,通常是脚本的良好选择,但如果Python、Ruby、$lang开发人员要使用您的工具,请尽可能使用$lang。bash本身只是一个普通的C程序,不需要特殊权限即可运行,可以放在任何位置。您可以轻松地从源代码构建它。基本上,如果需要并且不需要系统管理员来安装bash,您可以运行bash 只要它在您的路径中,您就可以始终使用该行编写脚本
#!/usr/bin/env bash
bash本身只是一个普通的C程序,不需要特殊权限运行,可以放在任何位置。您可以轻松地从源代码构建它。基本上,如果需要并且不需要系统管理员来安装bash,您可以运行bash 只要它在您的路径中,您就可以始终使用该行编写脚本
#!/usr/bin/env bash
你可能给自己一种错误的便携感。。。我经常从shell中使用的命令中发现问题,而不仅仅是shell本身。我们使用的古老系统有bash,但实际上是sed、find、grep等的旧版本。还要记住,在manu Linux系统上,
/bin/sh
只是指向/bin/bash
和Ubuntu(从6.10开始)的符号链接这是Dash。@JoachimPileborg:但是当bash被称为/bin/sh时,它将进入sh兼容模式。您可能给自己一种错误的可移植性感觉。。。我经常从shell中使用的命令中发现问题,而不仅仅是shell本身。我们使用的古老系统有bash,但实际上是sed、find、grep等的旧版本。还要记住,在manu Linux系统上,/bin/sh
只是指向/bin/bash
和Ubuntu(从6.10开始)的符号链接这是破折号。@JoachimPileborg:但是bash在被称为/bin/sh时将进入sh兼容模式。我已经看到许多项目使用Python和Perl来编写相关的脚本。一方面,它的功能非常强大,因为您可以使用完整的编程语言,而且行为更加一致,但另一方面,您添加了另一个依赖项。我想,一切都是一种权衡。我想这对我来说主要是一个哲学问题,但我想做出最好的技术决策,我只是不太了解shell的背景知识和历史以及所有不同变体的复杂性。你是为非动态语言开发人员(C、Java等)编写的脚本吗?或者这些脚本是谁和任何平台都可以使用的?几乎完全是C++ C++项目,一些开源和一些专有的,所有的意图都是在尽可能多的平台上运行。问题解决了!(开玩笑!)我还没有找到支持这一点的使用数据,但有趣的是(不是你想要的!)Perl总是可用的。这是一个没有包管理器的简单安装,只要您不需要CPAN模块,我看开发人员不会有任何问题。使用Perl,您不必担心奇怪的shell inter