Command Shell: Difference between revisions
Add category shell |
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.
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:
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):
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:
users.users.myuser.shell = pkgs.fish;
You can also choose whether or not a user should use the default shell:
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:
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
exittwice, 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.