编写 Bash 脚本或 Bourne 脚本是更好的做法吗?我的团队编写 Bourne 脚本,但我不完全确定原因。
如果这是一个圣战问题(即:vim 与 emacs),请回复:圣战。
您可以更加确定 Bourne shell 将安装在任何给定的 Unix 计算机上。是的,Bash 在 Linux 上无处不在,但整个世界都不是 Linux。
这取决于您的目标平台是什么。
如果您只针对主要的 Linux 发行版和 Mac OS X,那么您可以确信这些系统将提供 bash。在其他 UNIX(例如,AIX、Solaris、HP-UX)上,bash 可能不一定存在,因此 Bourne 是更安全的选择。如果 bash 可用,我想不出你可能更喜欢 Bourne 的理由。
最重要的是要记住,并非每个操作系统都像某些 Linux 发行版那样将 /bin/sh 软链接到 /bin/bash。许多脚本是为 bash 编写的,但开头是:
#!/bin/sh
以便它们在 Ubuntu 中中断。因此,当您编写 bash 脚本时,请始终编写:
#!/bin/bash
好吧,这是一个品味问题,但对于初学者来说,bourne shell 脚本可以用 bash 运行,而且我认为 bash 具有 Bourne 无法运行的功能。
我使用 Bash 作为我的登录 shell,但对于脚本,我会在一周中的任何一天选择 Bourne shell,在周日选择两次。Bash 具有更好的功能、更好的用户友好性和更好的错误。
实际上,让我在登录时选择 Bash 的东西,让我在编写脚本时避免使用它。Bash 试图让用户的一切都变得美好和舒适,但代价是 776 kB 可执行文件(在我的机器上),而 Bourne shell 则为 140 kB。为什么我的脚本会关心用户友好性?我可能通过使用一些巧妙的 Bash 函数获得的任何收益都被 shell 占用空间有效地抵消了,它的大小是原来的五倍以上。
我有运行 Linux、FreeBSD 和 OS X 的计算机。虽然我很少在计算机之间移动任何东西,但很高兴有这种可能性。在 Bourne shell 脚本中,您只需键入
#!/bin/sh
它只是工作。总是。Bash 在 Linux 上可能很常见,但它不像 Bourne shell 那样标准化。在 FreeBSD 上,默认情况下不安装 Bash。如果系统管理员认为这是一个好主意,它可以从 Ports 安装,但即便如此,它最终还是在/usr/local/bin/bash(不是/bin/bash)中。因此,如果你仍然决定使用 Bash,你应该写
#!/usr/bin/env bash
使脚本可移植。env
无论您的 Unix 风格如何(只要它已安装),都会为您找到 shell。
归根结底,这是您的选择。只需确保您的脚本实际上符合您选择的外壳程序,而不是依赖“sh”符号链接到“bash”或类似的东西。
可移植性。除非事情变得非常痛苦,否则我会写作#!/bin/sh
,然后我会写作#!/bin/bash
。世界瞬息万变,我敢打赌,将来说服系统管理员安装 bash 会很容易。但是我在大多数事情上都使用 Bourne 来对冲我的赌注,这很简单。
在 Mac OS X 上 /bin/sh 不是 Bourne shell。(但你可能会在新鲜肉上得到一个真正的 bournesh)。
要识别传统的 Bourne shell,您可以尝试使用抑扬符 ^(插入符号)来代替 | (管道)。
看:
传统的伯恩贝壳家族,
我会再次选择 bourne shell,因为 bourne shell 在 unix 实现中可能略有不同。有bash
你可以肯定的bash
是永远bash
。