gpt4 book ai didi

linux - 使 Unix shell 脚本符合 POSIX 标准

转载 作者:IT王子 更新时间:2023-10-29 00:12:42 27 4
gpt4 key购买 nike

我一直在研究一个 shell 脚本来自动执行一些任务。确保 shell 脚本在大多数平台上运行没有任何问题的最佳方法是什么。例如,我一直在使用 echo -n 命令将一些消息打印到屏幕上而没有尾随换行符,并且 -n 开关在某些 ksh 中不起作用炮弹。有人告诉我该脚本必须符合 POSIX 标准。如何确保脚本符合 POSIX 标准。有工具吗?或者是否有一个 shell 仅支持最低限度的 POSIX 要求?

最佳答案

POSIX

第一步是将 shebang 设置为 /bin/shuse shellcheck site,它会告诉您什么有效或无效以及原因。分析您的脚本。
例如,将此脚本粘贴到 shellcheck 编辑器窗口中:

#!/bin/sh
read -r a b <<<"$1"
echo $((a+b))

得到一个指示:“在 POSIX sh 中,这里的字符串是未定义的”。

作为第二步,您可以使用尽可能与 POSIX 兼容的 shell。
一个与大多数其他简单 shell 兼容的 shell,is dash , Debian 默认系统 shell,它是旧版 BSD ash 的衍生版本。

另一个与 posix 兼容的 shell 是 posh。

但是,dash 和/或 posh 可能不适用于某些系统。

有 lksh(带有 ksh 风格),目标是与遗留(旧)shell 脚本兼容。从它的手册:

lksh is a command interpreter intended exclusively for running legacy shell scripts.

但是在调用lksh时需要使用选项,比如-o posix-o sh:

Note that it's strongly recommended to invoke lksh with at least the -o posix option, if not both that and -o sh, to fully enjoy better compatibility to the POSIX standard (which is probably why you use lksh over mksh in the first place) or legacy scripts, respectively.

您可以调用 lksh -o posix -o sh 而不是简单的 lksh

使用选项是一种使其他 shell 兼容 POSIX 的方法。与 lksh 一样,使用选项 -o posix,例如 bash -o posix

在 bash 中,甚至可以在脚本中启用 POSIX 选项,方法是:

shopt -o posix            # also with: set -o posix

还可以创建一个到 bashzsh 的本地链接,使两者都像旧的 sh shell。像这样:

$ ln -s /bin/bash ./sh
$ ./sh

有很多替代品(dash、posh、lksh、bash、zsh 等)可以获得一个可以用作 POSIX shell 的 shell。

便携

然而,即便如此,以上种种并不能确保“可移植性”。

不幸的是,使 shell 脚本“符合 POSIX”通常比使其在任何真实世界的 shell 上运行更容易。

现实世界中唯一明智的建议是在多个 shell 中测试您的脚本。
如上面的列表:dash、posh、lksh 和 bash --posix。

Solaris 是一个独立的世界,您可能需要针对/bin/sh 和 xpg4/sh 进行测试。

跟进:

How can I test for POSIX compliance for shell scripts?

关于linux - 使 Unix shell 脚本符合 POSIX 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916071/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com