We are currently in the /home/student/ directory. We execute the following commands:
pwd; (ls) || { cd .. && ls student/; } && cd student ||
(ls) is executed in a subshell, because the commands are seperated with ";"
ls
is executed in a subshell because of the parentheses. Parentheses introduce subshells.
But I have no idea why other commands are executed?
Unlike other programming languages you might be familiar with, bash does not give &&
higher precedence than ||
. They have equal precedence and are evaluated from left to right.
If you had a || b && c
, in other languages this would be read as a || {b && c;}
. If a
were true then neither b
nor c
would be evaluated.
In bash, though, it's parsed as {a || b;} && c
(strict left-to-right precedence), so when a
is true b
is skipped but c
is still evaluated.