Updated SC2155 (markdown)

Mingye Wang
2020-05-12 13:06:35 +08:00
parent a2aa39371f
commit 0cbc4905ac

@@ -66,15 +66,19 @@ foo="$(mycmd)"
readonly foo readonly foo
``` ```
#### Word splitting and quoting issue with dash, maybe others ## Word splitting and quoting issue with dash, maybe others
A serious quoting problem with dash is another reason to declare and assign separately. Dash is the [default, `/bin/sh` shell on Ubuntu](https://wiki.ubuntu.com/DashAsBinSh). More specifically, dash version 0.5.8-2.10 and others cannot run this code: A serious quoting problem with dash is another reason to declare and assign separately. Dash is the [default, `/bin/sh` shell on Ubuntu](https://wiki.ubuntu.com/DashAsBinSh). More specifically, dash version 0.5.8-2.10 and others cannot run this code:
```sh ```sh
VAR1='white spa/ce' f(){ local e=$1; }
local var2=$(printf '%s' "${VAR1}") g(){ local g=$(printf '%s' "foo 2"); }
f "1 2"
g
``` ```
While this runs fine in other shells, [dash doesn't treat this as an assignment](http://mywiki.wooledge.org/BashPitfalls#local_var.3D.24.28cmd.29) and fails like this: While this runs fine in other shells, [dash doesn't treat this as an assignment](http://mywiki.wooledge.org/BashPitfalls#local_var.3D.24.28cmd.29) and fails like this:
``` ```
local: spa/ce: bad variable name local: 2: bad variable name
``` ```
After separating this runs fine in any shell. If you really don't want to separate it, you can double quote the substitutions. The direct workaround to this bug is to quote the right-hand-side of the assignment. Separating declaraction and assignment also makes this runs fine in any shell.
(A rule to catch this problem is in the works at [#1556](https://github.com/koalaman/shellcheck/issues/1556)).