我已经看到通常在提到 shell 时使用的短语“sh compatible”。我不确定它是否也适用于可能在 shell 中运行的程序。
shell 或其他程序“sh 兼容”是什么意思?“sh不兼容”是什么意思?
编辑:这个问题询问 bash 和 sh 之间的区别非常相关: Difference between sh and bash
我仍然想直接回答“sh 兼容”的含义。一个合理的预期可能是“sh 兼容”意味着“实现了 Shell 命令语言”,但是为什么有这么多“sh 兼容”的 shell,它们为什么不同呢?
一个非常简单的小程序的可执行文件,比如下面显示的,在一种 Linux 上编译的,它会在不同的 Linux 上运行吗?还是需要重新编译?
在这种情况下,机器架构重要吗?
int main()
{
return (99);
}
Run Code Online (Sandbox Code Playgroud) Node.js现在非常流行,我一直在用它编写一些脚本。不幸的是,兼容性是一个问题。正式地,Node.js 解释器应该被称为node,但 Debian 和 Ubuntu 提供了一个名为的可执行文件nodejs。
我想要 Node.js 可以在尽可能多的情况下使用的可移植脚本。假设文件名是foo.js,我真的希望脚本以两种方式运行:
./foo.js如果node或nodejs在 中,则运行脚本$PATH。node foo.js还运行脚本(假设调用了解释器node)注意: xavierm02 和我自己的答案是多语言脚本的两种变体。如果存在,我仍然对纯粹的shebang解决方案感兴趣。
我知道 OSX 和 Linux 之间有很多区别,但是是什么让它们如此完全不同,以至于它们根本不兼容?
在选择可以安装 Linux 的笔记本电脑方面,我一直很不走运。如果不是开箱即用的无线网卡,那就是显卡。此外,我仍然无法使我的计算机休眠、合上盖子并在稍后从我离开的地方恢复。我总是不得不关闭笔记本电脑或让它一直开着。
是否有笔记本电脑供应商被认为在性能和与 Linux 的兼容性之间取得了最佳平衡?如果没有,那么在购买笔记本电脑时应该注意什么?
在讨论 Linux 内核和 GUI ABI 的向后兼容性时,Alan Cox 指出“我的 3.6rc 内核仍将运行 1992 年构建的 Rogue 二进制文件。X 重新兼容比 Linux 更古老的应用程序。 ”
那么 Linux应用程序二进制接口的向后兼容程度如何?
什么是最古老的二进制可执行文件,实际上是在几年前编写和编译的,仍然可以在现代股票通用 Linux 发行版上运行?
我相信所有这些话都可以解释。我的主要观点是通过模拟器或专门的虚拟机或二进制翻译器运行它是不公平的,但一些这样的东西可能内置在一些现代发行版中,了解它是这里乐趣的一部分。
硬件架构、可执行文件格式、语言和主要库动态加载依赖项的变化也很有趣。
请注意,当规则放宽时,这里有一个更进一步的例子。2002年的网页运行的a.out现代的Red Hat Linux可执行会谈有关使用真的老的Linux预ELF的a.out格式的可执行文件后做事modprobe binfmt_aout ,并获得/lib/ld.so和libc.so.4 同样,对于这个问题,周边兴趣的,但说明了各种各样的事情,进一步挖掘时可能会涉及。
为 BSD 粉丝更新,很高兴看到 iBCS2 支持旧的 Xenix 应用程序(如 1990 年的 zork/dungeon-2.5.6)和 SCO OpenServer 5.0.x 应用程序,最近支持 NetBSD 4.0.1(2008 年):iBCS2 & NetBSD | 虚拟化的乐趣。但同样的事情在 NetBSD 5.0.x 中似乎被打破了。
更新 2:一年后,在这个问题获得“播音员”徽章后,我仍在寻找答案。澄清一下,因为这是关于 API 的,它应该是一个“真正的”二进制(非零长度),至少仍然以原始方式工作。
我已经发现——可能是在 1990 年代中期(!)的 Usenet 上——构造
export var=value
Run Code Online (Sandbox Code Playgroud)
是一种 Bashism,可移植的表达方式是
var=value
export var
Run Code Online (Sandbox Code Playgroud)
我多年来一直提倡这一点,但最近有人向我提出质疑,我真的找不到任何文件来支持我曾经坚定的信念。
谷歌搜索"export: command not found"似乎没有提出任何有人实际遇到这个问题的案例,所以即使它是真的,我想这也不是很常见。
(我得到的点击似乎是复制/粘贴标点符号的新手,结果是'export: command not found或一些这样的,或者尝试使用exportwith sudo; 以及csh尝试使用 Bourne shell 语法的新手用户。)
我可以肯定的告诉大家,它适用于OS X和各种Linux发行版,包括那些地方sh是dash。
sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"' # see that it really is exported
value
Run Code Online (Sandbox Code Playgroud)
在当今世界,可以安全地说export var=value使用安全吗?
我想了解后果是什么。如果它不能移植到 v7“Bourne classic”,那也不过是琐事。如果有 shell 真的无法处理这种语法的生产系统,那么知道这会很有用。
显然可以编译 glibc--enable-kernel以支持旧的内核版本。但是,我无法找到有关特定 glibc 版本支持哪些内核版本的信息。理想情况下,我希望看到每个 glibc (2.x) 和内核 (2.6.x) 版本的兼容性矩阵。它存在吗?
如果它不存在,也许是因为每个 glibc 版本(在过去 5 年左右)都支持自 2.6.0 以来的所有内核?
(Arch = x86-64,如果这很重要)
我想知道为 dash、ash 和 sh 编写的脚本是否 100% 兼容?
dash 或 ash 或语法更改是否有任何附加功能?
据我所知,ash 是 sh 的直系后代。
cygwin 是否工作 line wine,在外部操作系统中提供兼容层?
compatibility ×10
linux ×4
shell ×3
history ×2
architecture ×1
ash ×1
compiling ×1
cygwin ×1
dash ×1
elf ×1
executable ×1
glibc ×1
kernel ×1
laptop ×1
node.js ×1
osx ×1
scripting ×1
shell-script ×1
wine ×1