感觉两个都很通用,比如 node 的 nvm 安装包就是用 bash 的。 如果想写一个跨平台的通用脚本,用 sh 还是 bash 比较好?
1
hztDbFXEed73dkMf May 18, 2019
主流 linux 发行版都默认 bash
|
2
junjieyuanxiling May 18, 2019 via Android
sh 一般是 bash 的软链接。
|
3
judeng May 18, 2019 ```
$ls -l /bin/sh lrwxrwxrwx 1 root root 4 Oct 20 2014 /bin/sh -> bash ``` linux 平台上目前的发行版,sh 均为 bash 的软链接 在 solaris 上 sh 和 bash 还有细小差别,比如环境变量的继承规则有点区别 推荐 bash |
4
xiaket May 18, 2019
推荐 bash, 不推荐使用 bash 特有语法, 造成兼容性问题你修起来头大.
|
5
sbw May 18, 2019
用 /bin/sh 的话,一般要保证你的 shell 脚本满足 POSIX 语法
|
6
iwtbauh May 18, 2019 via Android shell 的可移植性问题是个挺严重的问题。
shell 语言和解释器本身是可移植的,但是 shell 中调用的其他程序 sed awk 等等却有很多陷阱。 首先,如果特别在意可移植性,应该用 POSIX shell 而不是 bash,因为并非所有系统都预装 bash,例如 FreeBSD,但所有兼容 POSIX 标准的系统预装的默认 shell 都兼容 POSIX shell。在 debian 上,你可以使用 dash 来测试你的脚本。 第二,GNU/Linux 上的 sed awk,以及很多很多 shell 可能用到的命令,像 tar 啊 tr 啊 dd 啊这些,都是带有“ GNU 扩展”的。它们兼容 POSIX,但在之上增加了特别多的“专有”功能。如果你的 shell 脚本是为可移植性设计的,则不应该使用这些专有功能(但很可能在你不注意时就使用了,特别是互联网上有些教程根本没有告诉你这种方法是 GNU 扩展,是非 POSIX 的)。 |
8
mattx May 18, 2019
shell 常见有几个种类, bash zsh fish, bash 最通用. 一般 /bin/sh 是当前激活的 shell 的软连接, 如果脚本写 /bin/bash 就明确用 bash 执行了. zsh fish 有一些新特性. 大概想到这么多.
|
9
ech0x May 18, 2019 @junjieyuanxiling #2 其实不是了,有些发行版已经换成 dash 了
|
10
caliburn1994 May 18, 2019
具体是什么也不知道,之前其他人写的代码是根据 bash,然后我用 sh 去运行,报错了。后来被告知要用 bash ***去运行
听说是语法不同,不是完全兼容之类。 |
11
mritd May 18, 2019 via iPhone
你怕是没用过 busybox
|
12
starrycat May 18, 2019
bash 交互比较好,语法写起来舒服
|
14
wu67 May 18, 2019
看发行版吧, 反正 sh 就指向別的... 曾经 Ubuntu 默认 dash, 然后我 sh 某脚本一堆爆炸. 所以现在我都是直接敲 bash ***.sh 要不就./***.sh
|
15
Tink PRO 我觉得挺大的,我经常写好的 bash 在某些只有 sh 的环境里得改好多地方
|
16
itechify PRO 有,脚本语法有点不同,具体忘记了,好似是判断语句
|
17
ryd994 May 19, 2019 via Android
|
18
iwtbauh May 19, 2019 via Android
@neroxps #7
正常情况,macosx 是基于 FreeBSD 的,这些基本工具都是不太可能兼容 GNU 扩展的。它们有的是 BSD 扩展。 如果脚本需要在多处运行,尽量避免使用这些“专有”扩展。但完全用 POSIX 可能使某些功能的实现变得复杂。 |
19
beginor May 19, 2019 via Android
第一行一般写 `#!/bin/bash -e` , 这样碰到错误就会直接退出。
但是写成 `#!/bin/sh -e` 就不行 。 |
20
Sanko May 19, 2019 via Android
sh = bash -posix
|
21
serge001 May 17, 2020
ls -l /bin/sh 在 wsl 上默认输出为:lrwxrwxrwx 1 root root 4 May 21 2019 /bin/sh -> dash
|