gue*_*tli 8 command-line bash scripts sh
“Bashism”是指只有 bash shell 而不是其他 shell 理解的 shell 语法。
如果您编写的脚本仅在/bin/bash存在的环境中执行,那么我认为避免 Bashism 只是无用且浪费时间,但也许我遗漏了一些东西。
如果允许您使用仅在 Bash 中可用的功能,那么以更复杂的方式编写脚本有什么好处?
还有一个后续问题:bash vs dash的速度有具体数字吗?
我在这里发表了我的结论:https : //github.com/guettli/programming-guidelines/#portable-shell-scripts
Ser*_*nyy 14
第一,便携性。如果您确定 bash(最好是相同的或更新的)版本将在您使用脚本的任何地方都存在,那没有错。如果您是一名开发人员或系统管理员,希望在 Ubuntu 之外的类 Unix 操作系统上使用软件,并且他们可能有也可能没有bash,那么 bashisms 将不会被/bin/sh.
第二,POSIX 合规性。如果您编写和提交脚本作为 OS 或项目的一部分,它们通常需要符合/bin/sh语法,这基本上就是 POSIX 标准。 /bin/sh出于性能原因,通常首选,所以如果您需要 shell 脚本的速度,bashisms 和因此 bash 可能需要避免。
简而言之,bashisms 并不坏。这实际上取决于您编写脚本的上下文。如果可以肯定 bash 将可用,并且不是很过时,那么所有人都会使用这些功能 - 它们存在是有原因的。
ilk*_*chu 10
没有,因此,如果您知道您正在使用 Bash 特定的功能,并记住使用#!/bin/bashhashbang 而不是假设/bin/sh是 Bash。
在 Ubuntu(和 Debian)中,#!/bin/sh当默认值/bin/sh更改为 Dash 而不是 Bash时,脚本中的“bashisms”主要是一个问题(参见Ubuntu wiki 中的 DashAsBinSh)。所有运行的脚本/bin/sh都必须检查 bashisms 并修复以使用 Dash 支持的标准功能。变化不是关于 Bash 的可用性(它仍然是一个Essential包,所以总是安装),而是关于速度:在 systemd 之前,启动过程产生了许多 shell 脚本,将默认 shell 更改为更快的脚本实际上产生了影响。
在其他系统上,/bin/sh可能仍然是 Bash,这使得在标有#!/bin/sh. 它们不会直接在sh不是 Bash的系统中工作。还有一些系统根本没有 Bash。嵌入式系统通常只有 Busybox 外壳。非 Linux Unixen 可能没有 Bash,尽管它们通常有一些版本的 ksh,这是 Bash 的许多功能的来源。但是,它们不是 1:1 兼容的。
Bash 中的一些非标准功能非常有用(例如数组、子字符串切片 ( ${var:n:m})、文本替换 ( ${var/foo/bar})),因此如果它们使您的脚本更易于编写,请务必使用 Bash。
也就是说,有一些 bashisms 具有直接的标准等价物,这意味着几乎没有或没有理由使用非标准变体。想到的一些:
==在运营商[ .. ]是非标准的,但相当于标准=操作function f { ... }和f() { ... }在 Bash 中是等价的,但前者是非标准的。(它来自 ksh,其中有区别。)$((--n)) 是非标准的,但可以替换为 $((n=n-1)) [[ ... ]]可以用标准代替[ .. ]