Jump to content

Command Shell: Difference between revisions

From NixOS Wiki
Claes (talk | contribs)
Add category shell
Pigs (talk | contribs)
Adds section on using different shell in nix development environments
Tags: Mobile edit Mobile web edit Advanced mobile edit
Line 2: Line 2:


{{note|[[Zsh]] is used here as an example. You can use other shells, e.g. {{ic|fish}} or {{ic|nushell}}.}}
{{note|[[Zsh]] is used here as an example. You can use other shells, e.g. {{ic|fish}} or {{ic|nushell}}.}}
== Enable ==
== Enable ==
When adding a new shell, always enable the shell system-wide, even if it's already enabled in your [[Home Manager]] configuration, otherwise it won't source the necessary files.
When adding a new shell, always enable the shell system-wide, even if it's already enabled in your [[Home Manager]] configuration, otherwise it won't source the necessary files.


Line 16: Line 18:
To set a command shell as the default for all users, use the [https://search.nixos.org/options?query=defaultUserShell <code>defaultUserShell</code>] option.
To set a command shell as the default for all users, use the [https://search.nixos.org/options?query=defaultUserShell <code>defaultUserShell</code>] option.


For example, to set Zsh as the default user shell for all users:
For example, to set Zsh as the default user shell for all users(including root):


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
Line 37: Line 39:
users.users.myuser.useDefaultShell = true;
users.users.myuser.useDefaultShell = true;
</nowiki>}}
</nowiki>}}
== Using a different shell in nix-shell and nix develop ==
By default, both <code>nix develop</code> and <code>nix-shell</code> launch an interactive bash shell. However, it is possible to configure these environments to use an alternative shell.
There are multiple approaches available:
=== nix-your-shell ===
Refer to [https://github.com/MercuryTechnologies/nix-your-shell nix-your-shell] for installation and usage instructions.
=== any-nix-shell ===
Refer to [https://github.com/haslersn/any-nix-shell any-nix-shell] for installation and usage instructions.
=== Aliasing command ===
A simple, lightweight method is to alias the relevant commands to invoke the shell directly. For example:
{{file|.bashrc|bash|
<nowiki>
alias nix-shell='nix-shell --run zsh'
nix() {
  if [[ $1 == "develop" ]]; then
    shift
    command nix develop -c zsh "$@"
  else
    command nix "$@"
  fi
}
</nowiki>
}}
There are some caveats with this approach:
* Nested shells will require you to type <code>exit</code> twice, once to leave the inner shell and once to exit the Nix shell environment itself.
* Potential for alias conflicts as overriding commands can introduce unintended side effects in scripts or other tooling that expects the standard behavior.


== See also ==
== See also ==

Revision as of 16:37, 6 May 2025

A shell is a program that translates text commands (like ls, vim, reboot etc) into instructions for your computer. The default shell on NixOS is bash, but it can be easily changed.

Note: Zsh is used here as an example. You can use other shells, e.g. fish or nushell.

Enable

When adding a new shell, always enable the shell system-wide, even if it's already enabled in your Home Manager configuration, otherwise it won't source the necessary files.

For example, for Zsh:

❄︎ /etc/nixos/configuration.nix
programs.zsh.enable = true;

Changing the default shell

For all users

To set a command shell as the default for all users, use the defaultUserShell option.

For example, to set Zsh as the default user shell for all users(including root):

❄︎ /etc/nixos/configuration.nix
users.defaultUserShell = pkgs.zsh;

For a specific user

To set a command shell as the default for a particular user, use the <name>.shell option.

For example, to set user "myuser"'s shell to fish:

❄︎ /etc/nixos/configuration.nix
users.users.myuser.shell = pkgs.fish;

You can also choose whether or not a user should use the default shell:

❄︎ /etc/nixos/configuration.nix
users.users.myuser.useDefaultShell = true;

Using a different shell in nix-shell and nix develop

By default, both nix develop and nix-shell launch an interactive bash shell. However, it is possible to configure these environments to use an alternative shell.

There are multiple approaches available:

nix-your-shell

Refer to nix-your-shell for installation and usage instructions.

any-nix-shell

Refer to any-nix-shell for installation and usage instructions.

Aliasing command

A simple, lightweight method is to alias the relevant commands to invoke the shell directly. For example:

≡︎ .bashrc
alias nix-shell='nix-shell --run zsh'
nix() {
  if [[ $1 == "develop" ]]; then
    shift
    command nix develop -c zsh "$@"
  else
    command nix "$@"
  fi
}

There are some caveats with this approach:

  • Nested shells will require you to type exit twice, once to leave the inner shell and once to exit the Nix shell environment itself.
  • Potential for alias conflicts as overriding commands can introduce unintended side effects in scripts or other tooling that expects the standard behavior.

See also