We make very careful considerations about the interface and operation of the GNU coreutils, but unfortunately due to backwards compatibility reasons, some behaviours or defaults of these utilities can be confusing.
This information will continue to be updated and overlaps somewhat with the coreutils FAQ, with this list focusing on less frequent potential issues.
Good tips and reminders for those who don't work mostly with a CLI (Command Line Interface).
[What has been YOUR biggest CLI gotcha? -Ed.]
(Score: 1) by shipofgold on Tuesday December 01 2015, @08:54PM
I always like the philosophy of Rob Pike as detailed at:
http://harmful.cat-v.org/cat-v/ [cat-v.org]
I still like commands with few options to which you can send output to other filters to get what you need. tar never needed the -x or -j or -J options.
My favorite gotcha is the difference between the for loop and the while loop in bash. While loops create subshells with a new environment while for loops do not. Makes changes to bash variables very interesting.
(Score: 3, Informative) by draconx on Tuesday December 01 2015, @09:10PM
This is not the case. Neither for nor while loops create a subshell.
(Score: 0) by Anonymous Coward on Tuesday December 01 2015, @09:33PM
It appears that while loops do: Bash Subshells [tldp.org]
(Score: 0) by Anonymous Coward on Tuesday December 01 2015, @09:35PM
Never mind, I just noticed that the while was enclosed in a ( ), which where the subshell comes from...
(Score: 5, Funny) by wonkey_monkey on Tuesday December 01 2015, @10:40PM
while for loops do not
Eh, so confused. I'm done.
systemd is Roko's Basilisk
(Score: 0) by Anonymous Coward on Tuesday December 01 2015, @10:42PM
tar never needed the -x or -j or -J options.
(I'm gonna assume you mean -X instead of -x since a tar that can't extract files is pretty useless!)
tar's command line is pretty bad to begin with [xkcd.com]. I prefer pax; too bad most distros don't ship it by default even though it's POSIX.
(Score: 2, Informative) by xav on Wednesday December 02 2015, @03:55AM
My favorite gotcha is the difference between the for loop and the while loop in bash. While loops create subshells with a new environment while for loops do not.
No, pipes do create subshells, not "while".
What I mean is that
# seq 1 3 | while read n; do echo $n; done
creates two subshells for seq and while, whereas
# for n in $(seq 1 3); do echo $n; done
creates only one subshell for seq, not for the "for" loop.
On the other hand, the two following while loops do the same thing in the current shell:
# while read n; do echo $n; done <<< "$(seq 1 3)"
# while read n; do echo $n; done < <(seq 1 3)