Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Unix shell之间的可移植性—我是否正确地考虑了这个问题?_Bash_Shell_Cross Platform_Portability_Sh - Fatal编程技术网

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或

每当我编写shell脚本(主要是软件开发实用程序或构建工具)时,我通常都会尽量避免使用bash,而使用普通的sh来实现可移植性。然而,最近我遇到了越来越多的问题,其中有用的功能不可用,或者使用sh的系统之间的行为实际上不如使用bash的系统一致,因为sh被别名为不同的shell

据我所知,sh是最古老的unixshell,精心编写的sh脚本理论上应该可以在任何系统上运行。。。但似乎每个主要外壳也有大约9000种不同的变体。使用bash作为脚本解释器是否有效地限制了脚本的可移植性?当然,在OSX或几乎所有的Linux上都没有问题,但是BSD呢?Solaris、AIX、HP-UX?如果你真的想什么都跑,你会怎么做

我知道bash几乎可以安装在任何操作系统上,但它真的是所有相关现代系统的一流公民吗?它是预装的吗?我只是不确定,为了获得最一致和可移植的总体体验,是否最好避免或接受bash

如果你真的想什么都跑,你会怎么做

您遵循(以及您正在调用的工具)并希望目标操作系统也这样做。任何称为“UNIX”的现代产品都必须遵循此标准,并且通常(尽管不是普遍)标准shell将被称为
/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