Created SC2067 (markdown)

koalaman
2014-03-01 16:44:13 -08:00
parent 1946836564
commit 1daaf3cc47

31
SC2067.md Normal file

@@ -0,0 +1,31 @@
## Missing ';' or + terminating -exec. You can't use |/||/&&, and ';' has to be a separate, quoted argument.
### Problematic code:
find . -type f -exec shellcheck {} | wc -l \;
find . -exec echo {} ;
### Correct code:
find . -type f -exec sh -c 'shellcheck "$1" | wc -l' -- {} \;
find . -exec echo {} \;
### Rationale:
`find -exec` is still subject to all normal shell rules, so all shell features like `|`, `||`, `&` and `&&` will apply to the `find` command itself, and not to the command you are trying to construct with `-exec`.
`find . -exec foo {} && bar {} \;` means run the command `find . -exec foo {}`, and if find is successful, run the command `bar "{}" ";"`.
To instead go through each file and run `foo file && bar file` on it, invoke a shell that can interpret `&&`:
find . -exec sh 'foo "$1" && bar "$1"' -- {} \;
You can also use find `-a` instead of shell `&&`:
find . -exec foo {} \; -a -exec bar {} \;
This will have the same effect (`-a` is also the default when two commands are specified, and can therefore be omitted).
### Contraindications
None