58

I see these two usage on Ubuntu "command && command" and "command ; command",
e.g. apt-get update && apt-get upgrade

What would differ if I use apt-get update; apt-get upgrade?
I am not asking for this specific usage but in general what is the difference between these two usage?

3
  • 2
    Win command-line and batch have the same feature: & (simple sequencing), && (conditional AND) and || (conditional OR).
    – Karan
    Jul 12, 2013 at 16:13
  • 6
    See also: Bash Reference Manual – List of commands. In general, there's nothing you can't find in the documentation; it's really worth looking at if you have a question about specific syntax elements.
    – slhck
    Jul 12, 2013 at 17:51
  • 1
    @Karan And for completeness, bash (linux/Ubuntu) has || as well.
    – Izkata
    Jul 12, 2013 at 19:09

2 Answers 2

97

&& is a logical operator. ; is simple sequencing.

In cmd1 && cmd2, cmd2 will only be run if cmd1 exits with a successful return code.

Whereas in cmd1; cmd2, cmd2 will run regardless of the exit status of cmd1 (assuming you haven't set your shell to exit on all failure in your script or something).

On a related note, with cmd1 || cmd2, using the || 'OR' logical operator, cmd2 will only be run if cmd1 fails (returns a non-zero exit code).

These logical operators are sometimes used in scripts in place of a basic if statement. For example,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

...can be more concisely achieved with:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
2
  • I find it a little bit fallacious because from my understanding, successful return code means 0, which, when cast into bool, gives a logical false. So going by the philosophy of Mccarthy evaluation used in most languages, it should immediately return false rather than evaluating (running) the next statement.
    – Della
    Jan 10, 2019 at 3:53
  • 1
    @Della 0 corresponding to false and non-0 to true is just a convention; for command exit statuses, it makes more sense to use the opposite convention, so that's what the shell does. May 6, 2020 at 23:50
36

Syntax

command1 && command2

command2 is executed if, and only if, command1 returns an exit status of zero (true). In other words, run command1 and if it is successfull, then run command2.

command1 ; command2

Both command1 and command2 will be executed regardless. The semicolon allows you to type many commands on one line.

Related:

command1 || command2

command2 is executed if, and only if, command1 returns a non-zero exit status. In other words, run command1 successfully or run command2.


Example

&& operator:

$ rm /tmp/filename && echo "File deleted"

; operator:

$ echo "foo" ; echo "bar"

|| operator:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

External Links

  1. Linuxtopia.org
  2. Tldp.org

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.