What do the '&&
', '\
' and '-
' mean at the end of bash commands?
In particular, I came across the following combination of lines that are supposed to add public keys to Ubuntu's aptitude package manager, what are those characters used here for?
gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \ gpg --export --armor 26C2E075 | sudo apt-key add - && \ sudo apt-get update
"&&" is used to chain commands together, such that the next command is run if and only if the preceding command exited without errors (or, more accurately, exits with a return code of 0).
"\" by itself at the end of a line is a means of concatenating lines together. So the following two lines:
are processed exactly the same as if the line was written as the single line:
"-" is a command line argument with no specific bash function. Exactly how it is handled is dependent on the command being run (in this case apt-key). Depending on context, it's typically used to indicate either "read data from stdin rather than from a file", or "process the remainder of the line as data rather than as command line arguments".
&& Is the logical AND:
&& is a way of expressing Logical AND, meaning the entire expression is True only if both sides of it are true. In logic, it is said the the entire statement (P&Q) is only true when both P and Q are true.
As a consequence of this, computers generally treat P&Q as a short-circuit evaluation. So since the entire statement will only be True if Both P and Q are true, then if P is false, the statement Q is not evaluated. Basically computers are lazy (efficient), and don't bother evaluating Q if they don't have too. This is also True of logical OR, see the previous link.
The Three Contexts of && in Bash:
1) Using Short-Circuit Evaluation with the exit status of a Command:
Every command has an exit status. If a command has an error the it has an exit status that is non-zero. So if the exit status is non-zero and && is used to chain commands together into a statement, later commands won't be evaluated (executed) if the earlier one did not have an exit status of 0 (True). This is because of short-circuit evaluation. So if you have:
Q will not be executed if P was not true ( if P exits with a status of anything but 0, it is not true). Just the same as:
make will not be executed if configure had an error, wasn't true. So basically, then ends up being a way of writing in if then statement:
Keep in mind then in most contexts 0 is false, but not when it comes to an exit status.
2) && Can be Used in Bash's built in [[ ]] test command:
&& Can also be used inside of the built-in test command in bash [[ ]] to combine expressions in a similar fashion as combining commands. The entire test operation will only be true if both operands (sides) of && are true, for example:
would be a way of saying if $a is an integer between 2 and 5 (not including 2 and 5).
3) Arithmetic Evaluation:
Lastly, && can be used in arithmetic evaluation as Logical AND. If both (logical AND) of the numbers in the following are non-zero, it returns 0, else 1 is returned:
I think you will better with an explanation of the "real" meaning, implications are another thing :)
\
is the "escape character", and it is one of the three quoting mechanisms available in bash: This means that if you put an escape character (the "\") at the very end of a line you are in fact escaping the new line char that immediately follows it (the RETURN char) thus having the effect of "continue the line" others have already explained in their answerMy 2 cents