Command Shell: Difference between revisions

imported>Flexagoon
No edit summary
m I added a small section helping users to fix a strange problem with the fish shell when using it alongside flakes. I think it was worth adding because I followed this page, but was suprised to find strange output when I ran a command that didn't exist.
 
(20 intermediate revisions by 11 users not shown)
Line 1: Line 1:
A shell is a program that translates text commands (like {{ic|ls}}, {{ic|vim}}, {{ic|reboot}} etc) into instructions for your computer. The default shell on NixOS is [[bash]], but it can be easily changed.
A [https://en.wikipedia.org/wiki/Unix_shell shell] is a program that translates text commands (like {{ic|ls}}, {{ic|vim}}, {{ic|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]]:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
programs.zsh.enable = true;
</nowiki>}}
 
== Changing the default shell ==
 
=== For all users ===
 
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(including root):


== Changing default shell ==
Shells can be changed system-wide and per-user. To change the shell system-wide, add the following line to your config:
{{note|[[Zsh]] is used here as an example. You can use other shells, eg {{ic|pkgs.fish}}.}}
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
users.defaultUserShell = pkgs.zsh;
users.defaultUserShell = pkgs.zsh;
</nowiki>}}
</nowiki>}}
then run {{ic|nixos-rebuild switch}} and reboot your system.


To only change the default shell for one of the users, add
=== For a specific user ===
 
To set a command shell as the default for a particular user, use the [https://search.nixos.org/options?query=%3Cname%3E.shell <code><nowiki><name></nowiki>.shell</code>] option.
 
For example, to set user "myuser"'s shell to [[fish]]:
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
shell = pkgs.zsh;
users.users.myuser.shell = pkgs.fish;
</nowiki>}}
</nowiki>}}
to your user's section like so:
 
You can also choose whether or not a user should use the default shell:
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
users.users.yourname = {}
users.users.myuser.useDefaultShell = true;
  ... # Your user configuration
  shell = pkgs.zsh;
};
</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.
== Using Flakes ==
If you are using [[Flakes]] with fish, the 'command-not-found' error message will not work correctly, but can be fixed by disabling the builtin Nix <code>command-not-found</code> program:<ref>https://github.com/NixOS/nixpkgs/issues/425613#issuecomment-3076081921</ref>
{{File|3=programs.command-not-found.enable = false;|name=/etc/nixos/configuration.nix|lang=nix}}


== See also ==
== See also ==
* [[Fish]]
* [[Nushell]]
* [[Zsh]]
* [[Zsh]]
* [[Flakes]]
[[Category:Configuration]]
[[Category:Software]]
[[Category:Shell]]