101

In Bash/ZSH and other shells, I am used to using && and ||.

Is there any equivalent in Fish?

Albert
  • 6,531
  • 11
  • 39
  • 51
  • This syntax now supported on the master branch and will be released in Fish 3.0 (https://github.com/fish-shell/fish-shell/commit/014b91488db29480160284adfd1cddf286d2888a) – Elliott Beach Mar 29 '18 at 01:31

2 Answers2

136

Fish doesn't have a special syntax for a logical AND (&&) or a logical OR (||).

Instead, you can use the commands and and or, which verify the previous command's exit status and act accordingly:

command1
and command2
command1
or command2

Furthermore – just like in bash – you can use a semicolon ; to execute two commands one after the other:

command1 ; command2

This allows using a more familiar syntax:

command1 ;and command2
command1 ;or command2

See http://fishshell.com/docs/current/tutorial.html#tut_combiners

lindhe
  • 235
  • 1
  • 3
  • 14
Dennis
  • 48,917
  • 12
  • 130
  • 149
  • 4
    There's an open github issue to add support for this syntax: [&& doesn't work · Issue #150 · fish-shell/fish-shell](https://github.com/fish-shell/fish-shell/issues/150) – aboy021 Feb 26 '16 at 00:41
  • 23
    `This allows using a more familiar syntax:` is very subjective – Petr Peller Jun 02 '16 at 10:46
  • 1
    `;and` is less readable than `&&` as the semicolon suggests a logically disjoint operation. It's visually jarring. – Elliott Beach Jul 30 '17 at 20:08
  • @Elliott I agree, but Fish doesn't give you a choice. – Dennis Jul 30 '17 at 20:11
  • 2
    do note though that in fish and bourne shells, AND and OR operators have the same order, unlike C based languages: https://unix.stackexchange.com/a/88851/50703 – balupton Jan 11 '18 at 08:31
  • @dennis which is a good thing: there's only one option, and you don't **have to choose**, it's already chosen for you. Plus I think that using a "native" solution instead of implementing a new syntax if far better, even though it might now look as good (and, as petr said, it's very subjective). – math2001 Jul 09 '18 at 03:06
  • You can't do `command1 and command2` though, command 2 will never be run because "and" will be considered as argument 1 for command1, and command2 will be considered as argument 2 for command1. For example `if true and true; echo yes; end` won't work because fish will think you're passing the arguments "and true" to the command true. `if true; and true; echo yes; end` is the correct way. – Shardj Jun 01 '22 at 14:17
19

The logical operators you're used to, are supported since fish 3.0.0, released on 2018-12-28.

From the v3 release notes:

  • fish now supports && (like and), || (like or), and ! (like not), for better migration from POSIX-compliant shells (#4620).
Dennis
  • 452
  • 5
  • 14