each { |num| 2 * $num }
}
```
Now, if we call the above command later in a pipeline, we can see what it does with the input:
```nu
[1 2 3] | double
# => ╭───┬───╮
# => │ 0 │ 2 │
# => │ 1 │ 4 │
# => │ 2 │ 6 │
# => ╰───┴───╯
```
::: tip Cool!
This command demonstrates both input and output _streaming_. Try running it with an infinite input:
```nu
1.. | each {||} | double
```
Even though the input command hasn't ended, the `double` command can still receive and output values as they become available.
Press <kbd>Ctrl</kbd>+<kbd>C</kbd> to stop the command.
:::
We can also store the input for later use using the [`$in` variable](pipelines.html#pipeline-input-and-the-special-in-variable):
```nu
def nullify [...cols] {
let start = $in
$cols | reduce --fold $start { |col, table|
$table | upsert $col null
}
}
ls | nullify name size
# => ╭───┬──────┬──────┬──────┬───────────────╮
# => │ # │ name │ type │ size │ modified │
# => ├───┼──────┼──────┼──────┼───────────────┤
# => │ 0 │ │ file │ │ 8 minutes ago │
# => │ 1 │ │ file │ │ 8 minutes ago │
# => │ 2 │ │ file │ │ 8 minutes ago │
# => ╰───┴──────┴──────┴──────┴───────────────╯
```
## Naming Commands
In Nushell, a command name can be a string of characters. Here are some examples of valid command names: `greet`, `get-size`, `mycommand123`, `my command`, `命令` (English translation: "command"), and even `😊`.
Strings which might be confused with other parser patterns should be avoided. For instance, the following command names might not be callable:
- `1`, `"1"`, or `"1.5"`: Nushell will not allow numbers to be used as command names
- `4MiB` or `"4MiB"`: Nushell will not allow filesizes to be used as command names
- `"number#four"` or `"number^four"`: Carets and hash symbols are not allowed in command names
- `-a`, `"{foo}"`, `"(bar)"`: Will not be callable, as Nushell will interpret them as flags, closures, or expressions.
While names like `"+foo"` might work, they are best avoided as the parser rules might change over time. When in doubt, keep command names as simple as possible.
::: tip
It's common practice in Nushell to separate the words of the command with `-` for better readability. For example `get-size` instead of `getsize` or `get_size`.
:::
::: tip
Because `def` is a parser keyword, the command name must be known at parse time. This means that command names may not be a variable or constant. For example, the following is _not allowed_:
```nu
let name = "foo"
def $name [] { foo }
```
:::
### Subcommands
You can also define subcommands of commands using a space. For example, if we wanted to add a new subcommand to [`str`](/commands/docs/str.md), we can create it by naming our subcommand starting with "str ". For example:
```nu
def "str mycommand" [] {
"hello"
}
```
Now we can call our custom command as if it were a built-in subcommand of [`str`](/commands/docs/str.md):
```nu
str mycommand
```
Of course, commands with spaces in their names are defined in the same way:
```nu
def "custom command" [] {
"This is a custom command with a space in the name!"
}
```
## Parameters
### Multiple parameters
In the `def` command, the parameters are defined in a [`list`](./types_of_data.md#lists). This means that multiple parameters can be separated with spaces, commas, or line-breaks.
For example, here's a version of `greet` that accepts two names. Any of these three definitions will work:
```nu
# Spaces
def greet [name1 name2] {
$"Hello, ($name1) and ($name2)!"
}
# Commas
def greet [name1, name2] {
$"Hello, ($name1) and ($name2)!"
}
# Linebreaks
def greet [
name1
name2
] {
$"Hello, ($name1) and ($name2)!"
}
```
### Required positional parameters
The basic argument definitions used above are _positional_. The first argument passed into the `greet` command above is assigned to the `name1` parameter (and, as mentioned above, the `$name1` variable). The second argument becomes the `name2` parameter and the `$name2` variable.