You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Rafael Cepeda edited this page Jul 18, 2020
·
2 revisions
Arithmetic modifications in command redirections may be discarded. Do them separately.
Problematic code:
curl "$URL">"image$((i++)).jpg"
Correct code:
i=$((i+1))
curl "$URL">"image$i.jpg"
Rationale:
You are using an arithmetic expression that modifies a variable, e.g. $((x+=1)) or $((x++)), in the name of a file to redirect from/to, in a here document, or in a here string.
The scope of these modifications depends on whether the command itself will fork:
echo foo >$((var++)).txt # Updates in BusyBox and Bash
cat foo >$((var++)).txt # Updates in Busybox, not in Bash
gcc foo >$((var++)).txt # Does not update in eithergcc() { /opt/usr/bin/gcc "$@"; }
gcc foo >$((var++)).txt # Now suddenly updates in both
Rather than rely on knowing which commands do and don't fork, or are and aren't overridden, simply do the updates in a separate command as in the correct code.
Exceptions:
If you know your variable is scoped the way you want it, you can ignore this warning.
Related resources:
Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!