首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

sh 和 bash 区别大吗?

  •  
  •   mytry · 205 天前 · 4581 次点击
    这是一个创建于 205 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉两个都很通用,比如 node 的 nvm 安装包就是用 bash 的。 如果想写一个跨平台的通用脚本,用 sh 还是 bash 比较好?
    20 回复  |  直到 2019-05-19 12:17:19 +08:00
        1
    elsonwx   205 天前
    主流 linux 发行版都默认 bash
        2
    junjieyuanxiling   205 天前 via Android
    sh 一般是 bash 的软链接。
        3
    judeng   205 天前   ♥ 1
    ```
    $ls -l /bin/sh
    lrwxrwxrwx 1 root root 4 Oct 20 2014 /bin/sh -> bash
    ```
    linux 平台上目前的发行版,sh 均为 bash 的软链接
    在 solaris 上 sh 和 bash 还有细小差别,比如环境变量的继承规则有点区别
    推荐 bash
        4
    xiaket   205 天前
    推荐 bash, 不推荐使用 bash 特有语法, 造成兼容性问题你修起来头大.
        5
    sbw   205 天前
    用 /bin/sh 的话,一般要保证你的 shell 脚本满足 POSIX 语法
        6
    iwtbauh   205 天前 via Android   ♥ 2
    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 的)。
        7
    neroxps   205 天前
    @iwtbauh 这个坑我踩过,在 macos 上,很疼。
        8
    mattx   205 天前
    shell 常见有几个种类, bash zsh fish, bash 最通用. 一般 /bin/sh 是当前激活的 shell 的软连接, 如果脚本写 /bin/bash 就明确用 bash 执行了. zsh fish 有一些新特性. 大概想到这么多.
        9
    ech0x   205 天前
    @junjieyuanxiling #2 其实不是了,有些发行版已经换成 dash 了
        10
    caliburn1994   205 天前
    具体是什么也不知道,之前其他人写的代码是根据 bash,然后我用 sh 去运行,报错了。后来被告知要用 bash ***去运行
    听说是语法不同,不是完全兼容之类。
        11
    mritd   205 天前 via iPhone
    你怕是没用过 busybox
        12
    starrycat   205 天前
    bash 交互比较好,语法写起来舒服
        13
    codehz   205 天前
    @mattx #8 没有激活当前 shell 这种事情的。。除非你手动创建链接,而改 shell 是在 /etc/passwd 里做的
        14
    wu67   205 天前
    看发行版吧, 反正 sh 就指向別的... 曾经 Ubuntu 默认 dash, 然后我 sh 某脚本一堆爆炸. 所以现在我都是直接敲 bash ***.sh 要不就./***.sh
        15
    Tink   205 天前 via iPhone
    我觉得挺大的,我经常写好的 bash 在某些只有 sh 的环境里得改好多地方
        16
    oneisall8955   205 天前 via Android
    有,脚本语法有点不同,具体忘记了,好似是判断语句
        17
    ryd994   205 天前 via Android
    @wu67
    @caliburn1994
    hashbang 了解一下
    第一行写
    #!/bin/bash
        18
    iwtbauh   205 天前 via Android
    @neroxps #7

    正常情况,macosx 是基于 FreeBSD 的,这些基本工具都是不太可能兼容 GNU 扩展的。它们有的是 BSD 扩展。

    如果脚本需要在多处运行,尽量避免使用这些“专有”扩展。但完全用 POSIX 可能使某些功能的实现变得复杂。
        19
    beginor   204 天前 via Android
    第一行一般写 `#!/bin/bash -e` , 这样碰到错误就会直接退出。

    但是写成 `#!/bin/sh -e` 就不行 。
        20
    Sanko   204 天前 via Android
    sh = bash -posix
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1016 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    ♥ Do have faith in what you're doing.