BEGIN(1) fish-shell BEGIN(1)

# [NAME](#NAME)

begin - start a new block of code

# [SYNOPSIS](#SYNOPSIS)

```
begin; [COMMANDS ...]; end
{ [COMMANDS ...] }
```

# [DESCRIPTION](#DESCRIPTION)

**begin** is used to create a new block of code.

A block allows the introduction of a new variable scope &lt;#variables-scope&gt;, redirection of the input or output of a set of commands as a group, or to specify precedence when using the conditional commands like **and**.

The block is unconditionally executed. **begin; ...; end** is equivalent to **if true; ...; end**.

**begin** does not change the current exit status itself. After the block has completed, **$status** will be set to the status returned by the most recent command.

Some other shells only support the **{ \[COMMANDS ...] ; }** notation.

The **-h** or **--help** option displays help about using this command.

# [EXAMPLE](#EXAMPLE)

The following code sets a number of variables inside of a block scope. Since the variables are set inside the block and have local scope, they will be automatically deleted when the block ends.

```
begin


    set -l PIRATE Yarrr


    ...
end
echo $PIRATE
# This will not output anything, since the PIRATE variable
# went out of scope at the end of the block
```

In the following code, all output is redirected to the file out.html.

```
begin


    echo $xml_header


    echo $html_header


    if test -e $file


        ...


    end


    ...
end > out.html
```

# [Copyright](#Copyright)

fish-shell developers

October 10, 2026 4.9

---

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