在我的桌面 ubuntu 主机上,如果我运行一个只包含以下行的脚本
echo $SHELL
它打印
/bin/bash
但是在运行 busybox 的另一台主机上,如果我执行同样的事情,我会得到
/bin/sh
打印
而且我注意到,如果我在我的 ubuntu 机器上创建脚本并在 busybox 主机上运行它们,那么有时我会得到不同的行为。
我想做的是在我的 ubuntu 桌面上创建一个快捷方式,指向某个终端会话,该会话将运行 Bourne Shell /bin/sh,而不是 Bourne Again Shell bash。这可能吗,还是我的想法错了?
答案1
首先,你应该阅读POSIX和不同的 shell 实现。然后,如果您需要可移植性,请尝试编写尽可能符合 POSIX 标准的脚本。
为了测试你的脚本是否能与 busybox 配合使用,你可以安装并运行busybox 默认 shell ash
检查脚本语法是否适用于 busybox:
sudo apt install ash
ash
# non-posix function declaration (works in bash, but not in ash)
$ function test(){ echo Hello World; }
ash: 1: Syntax error: "(" unexpected
# posix-compliant function declaration (works in ash and bash)
$ test(){ echo Hello World; }
$ test
Hello World
但这可能还不够,因为它仍将使用默认工具的 GNU 版本并具有您安装的所有其他程序,这些程序可能未与您的 busybox 一起安装。
ash
$ grep --version
grep (GNU grep) 2.25
如果你有码头工人,您可以运行busybox
容器仅使用其默认工具:
docker run -it --rm busybox
$ grep --version
grep: unrecognized option `--version'
BusyBox v1.29.3 (2018-10-01 22:37:18 UTC) multi-call binary.