FISH(1) fish-shell FISH(1)

# [NAME](#NAME)

fish - the friendly interactive shell

# [SYNOPSIS](#SYNOPSIS)

```
fish [OPTIONS] [FILE [ARG ...]]
fish [OPTIONS] [-c COMMAND [ARG ...]]
```

# [DESCRIPTION](#DESCRIPTION)

**fish** is a command-line shell written mainly with interactive use in mind. This page briefly describes the options for invoking **fish**. The full manual &lt;#intro&gt; is available in HTML by using the **help** command from inside fish, and in the [*fish-doc(1)*](/man/os/fish/fish-doc.1) man page. The tutorial &lt;&gt; is available as HTML via **help tutorial** or in *man fish-tutorial*.

The following options are available:

[**-c** or **--command=COMMAND**](#c)

Evaluate the specified commands instead of reading from the commandline. Any additional positional arguments are used as **$argv**.

[**-C** or **--init-command=COMMANDS**](#C)

Evaluate specified commands after reading the configuration but before executing command specified by **-c** or reading interactive input.

[**-d** or **--debug=DEBUG\_CATEGORIES**](#d)

Enables debug output and specify a pattern for matching debug categories. See Debugging below for details.

[**-o** or **--debug-output=DEBUG\_FILE**](#o)

Specifies a file path to receive the debug output, including categories and **fish\_trace** &lt;#envvar-fish\_trace&gt;. The default is standard error.

[**-i** or **--interactive**](#i)

The shell is interactive.

[**-l** or **--login**](#l)

Act as if invoked as a login shell.

[**-N** or **--no-config**](#N)

Do not read configuration files.

[**-n** or **--no-execute**](#n)

Do not execute any commands, only perform syntax checking.

[**-p** or **--profile=PROFILE\_FILE**](#p)

when **fish** exits, output timing information on all executed commands to the specified file. This excludes time spent starting up and reading the configuration.

[**--profile-startup=PROFILE\_FILE**](#profile)

Will write timing for **fish** startup to specified file.

[**-P** or **--private**](#P)

Enables private mode &lt;#private-mode&gt;: **fish** will not access old or store new history.

[**--print-rusage-self**](#print)

When **fish** exits, output stats from getrusage.

[**--print-debug-categories**](#print~2)

Print all debug categories, and then exit.

[**-v** or **--version**](#v)

Print version and exit.

[**-f** or **--features=FEATURES**](#f)

Enables one or more comma-separated feature flags &lt;#featureflags&gt;.

The **fish** exit status is generally the exit status of the last foreground command &lt;#variables-status&gt;.

# [DEBUGGING](#DEBUGGING)

While fish provides extensive support for debugging fish scripts &lt;#debugging&gt;, it is also possible to debug and instrument its internals. Debugging can be enabled by passing the **--debug** option. For example, the following command turns on debugging for background IO thread events, in addition to the default categories, i.e. *debug*, *error*, *warning*, and *warning-path*:

```
> fish --debug=iothread
```

Available categories are listed by **fish --print-debug-categories**. The **--debug** option accepts a comma-separated list of categories, and supports glob syntax. The following command turns on debugging for *complete*, *history*, *history-file*, and *profile-history*, as well as the default categories:

```
> fish --debug='complete,*history*'
```

Debug messages output to stderr by default. Note that if **fish\_trace** &lt;#envvar-fish\_trace&gt; is set, execution tracing also outputs to stderr by default. You can output to a file using the **--debug-output** option:

```
> fish --debug='complete,*history*' --debug-output=/tmp/fish.log --init-command='set fish_trace on'
```

These options can also be changed via the **FISH\_DEBUG** &lt;#envvar-FISH\_DEBUG&gt; and **FISH\_DEBUG\_OUTPUT** &lt;#envvar-FISH\_DEBUG\_OUTPUT&gt; variables. The categories enabled via **--debug** are *added* to the ones enabled by $FISH\_DEBUG, so they can be disabled by prefixing them with **-** (**reader-\*,-ast\*** enables reader debugging and disables ast debugging).

The file given in **--debug-output** takes precedence over the file in **FISH\_DEBUG\_OUTPUT** &lt;#envvar-FISH\_DEBUG\_OUTPUT&gt;.

# [EXAMPLES](#EXAMPLES)

To just start fish:

```
fish
```

To run a file with fish:

```
fish /path/to/script.fish
```

To run some commands with fish:

```
fish -c 'echo Hi there!'
```

You can also pass arguments to those commands:

```
> fish -c 'printf %s\n $argv' "first line" "second line"
first line
second line
```

To run a script, except read this other file first:

```
fish --init-cmd "source otherfile" script.fish
```

To profile &lt;#profiling&gt; fish's startup and find what takes the most time in your configuration:

```
fish --profile-startup /tmp/start.prof -ic exit
sort -nk2 /tmp/start.prof
```

# [Copyright](#Copyright)

fish-shell developers

October 26, 2026 4.9

---

Document: fish(1) from fish 4.9.3-r4 (Chainguard OS)
Source: https://github.com/fish-shell/fish-shell
