From 1daaf3cc472c1385a84869e1d8cac14572b6263c Mon Sep 17 00:00:00 2001 From: koalaman Date: Sat, 1 Mar 2014 16:44:13 -0800 Subject: [PATCH] Created SC2067 (markdown) --- SC2067.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 SC2067.md diff --git a/SC2067.md b/SC2067.md new file mode 100644 index 0000000..2165b2f --- /dev/null +++ b/SC2067.md @@ -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 \ No newline at end of file