Next: , Previous: , Up: Home Services   [Contents][Index]


13.3.2 Shells

Shells play a quite important role in the environment initialization process, you can configure them manually as described in section Configuring the Shell, but the recommended way is to use home services listed below. It’s both easier and more reliable.

Each home environment instantiates home-shell-profile-service-type, which creates a ~/.profile startup file for all POSIX-compatible shells. This file contains all the necessary steps to properly initialize the environment, but many modern shells like Bash or Zsh prefer their own startup files, that’s why the respective home services (home-bash-service-type and home-zsh-service-type) ensure that ~/.profile is sourced by ~/.bash_profile and ~/.zprofile, respectively.

Shell Profile Service

Data Type: home-shell-profile-configuration

Available home-shell-profile-configuration fields are:

profile (default: '()) (type: text-config)

home-shell-profile is instantiated automatically by home-environment, DO NOT create this service manually, it can only be extended. profile is a list of file-like objects, which will go to ~/.profile. By default ~/.profile contains the initialization code which must be evaluated by the login shell to make home-environment’s profile available to the user, but other commands can be added to the file if it is really necessary. In most cases shell’s configuration files are preferred places for user’s customizations. Extend home-shell-profile service only if you really know what you do.

Bash Home Service

Data Type: home-bash-configuration

Available home-bash-configuration fields are:

package (default: bash) (type: package)

The Bash package to use.

guix-defaults? (default: #t) (type: boolean)

Add sane defaults like reading /etc/bashrc and coloring the output of ls to the top of the .bashrc file.

environment-variables (default: '()) (type: alist)

Association list of environment variables to set for the Bash session. The rules for the home-environment-variables-service-type apply here (see Essential Home Services). The contents of this field will be added after the contents of the bash-profile field.

aliases (default: '()) (type: alist)

Association list of aliases to set for the Bash session. The aliases will be defined after the contents of the bashrc field has been put in the .bashrc file. The alias will automatically be quoted, so something like this:

'(("ls" . "ls -alF"))

turns into

alias ls="ls -alF"
bash-profile (default: '()) (type: text-config)

List of file-like objects, which will be added to .bash_profile. Used for executing user’s commands at start of login shell (In most cases the shell started on tty just after login). .bash_login won’t be ever read, because .bash_profile always present.

bashrc (default: '()) (type: text-config)

List of file-like objects, which will be added to .bashrc. Used for executing user’s commands at start of interactive shell (The shell for interactive usage started by typing bash or by terminal app or any other program).

bash-logout (default: '()) (type: text-config)

List of file-like objects, which will be added to .bash_logout. Used for executing user’s commands at the exit of login shell. It won’t be read in some cases (if the shell terminates by exec’ing another process for example).

You can extend the Bash service by using the home-bash-extension configuration record, whose fields must mirror that of home-bash-configuration (see home-bash-configuration). The contents of the extensions will be added to the end of the corresponding Bash configuration files (see Bash Startup Files in The GNU Bash Reference Manual.

For example, here is how you would define a service that extends the Bash service such that ~/.bash_profile defines an additional environment variable, PS1:

(define bash-fancy-prompt-service
  (simple-service 'bash-fancy-prompt
                  home-bash-service-type
                  (home-bash-extension
                   (environment-variables
                    '(("PS1" . "\\u \\wλ "))))))

You would then add bash-fancy-prompt-service to the list in the services field of your home-environment. The reference of home-bash-extension follows.

Data Type: home-bash-extension

Available home-bash-extension fields are:

environment-variables (default: '()) (type: alist)

Additional environment variables to set. These will be combined with the environment variables from other extensions and the base service to form one coherent block of environment variables.

aliases (default: '()) (type: alist)

Additional aliases to set. These will be combined with the aliases from other extensions and the base service.

bash-profile (default: '()) (type: text-config)

Additional text blocks to add to .bash_profile, which will be combined with text blocks from other extensions and the base service.

bashrc (default: '()) (type: text-config)

Additional text blocks to add to .bashrc, which will be combined with text blocks from other extensions and the base service.

bash-logout (default: '()) (type: text-config)

Additional text blocks to add to .bash_logout, which will be combined with text blocks from other extensions and the base service.

Zsh Home Service

Data Type: home-zsh-configuration

Available home-zsh-configuration fields are:

package (default: zsh) (type: package)

The Zsh package to use.

xdg-flavor? (default: #t) (type: boolean)

Place all the configs to $XDG_CONFIG_HOME/zsh. Makes ~/.zshenv to set ZDOTDIR to $XDG_CONFIG_HOME/zsh. Shell startup process will continue with $XDG_CONFIG_HOME/zsh/.zshenv.

environment-variables (default: '()) (type: alist)

Association list of environment variables to set for the Zsh session.

zshenv (default: '()) (type: text-config)

List of file-like objects, which will be added to .zshenv. Used for setting user’s shell environment variables. Must not contain commands assuming the presence of tty or producing output. Will be read always. Will be read before any other file in ZDOTDIR.

zprofile (default: '()) (type: text-config)

List of file-like objects, which will be added to .zprofile. Used for executing user’s commands at start of login shell (In most cases the shell started on tty just after login). Will be read before .zlogin.

zshrc (default: '()) (type: text-config)

List of file-like objects, which will be added to .zshrc. Used for executing user’s commands at start of interactive shell (The shell for interactive usage started by typing zsh or by terminal app or any other program).

zlogin (default: '()) (type: text-config)

List of file-like objects, which will be added to .zlogin. Used for executing user’s commands at the end of starting process of login shell.

zlogout (default: '()) (type: text-config)

List of file-like objects, which will be added to .zlogout. Used for executing user’s commands at the exit of login shell. It won’t be read in some cases (if the shell terminates by exec’ing another process for example).

Inputrc Profile Service

The GNU Readline package includes Emacs and vi editing modes, with the ability to customize the configuration with settings in the ~/.inputrc file. With the gnu home services shells module, you can setup your readline configuration in a predictable manner, as shown below. For more information about configuring an ~/.inputrc file, see Readline Init File in GNU Readline.

Variable: home-inputrc-service-type

This is the service to setup various .inputrc configurations. The settings in .inputrc are read by all programs which are linked with GNU Readline.

Here is an example of a service and its configuration that you could add to the services field of your home-environment:

(service home-inputrc-service-type
         (home-inputrc-configuration
           (key-bindings
            `(("Control-l" . "clear-screen")))
           (variables
            `(("bell-style" . "visible")
              ("colored-completion-prefix" . #t)
              ("editing-mode" . "vi")
              ("show-mode-in-prompt" . #t)))
           (conditional-constructs
            `(("$if mode=vi" .
               ,(home-inputrc-configuration
                  (variables
                   `(("colored-stats" . #t)
                     ("enable-bracketed-paste" . #t)))))
              ("$else" .
               ,(home-inputrc-configuration
                  (variables
                   `(("show-all-if-ambiguous" . #t)))))
              ("endif" . #t)
              ("$include" . "/etc/inputrc")
              ("$include" . ,(file-append
                               (specification->package "readline")
                               "/etc/inputrc"))))))

The example above starts with a combination of key-bindings and variables. The conditional-constructs show how it is possible to add conditionals and includes. In the example above colored-stats is only enabled if the editing mode is vi style, and it also reads any additional configuration located in /etc/inputrc or in /gnu/store/…-readline/etc/inputrc.

The value associated with a home-inputrc-service-type instance must be a home-inputrc-configuration record, as described below.

Data Type: home-inputrc-configuration

Available home-inputrc-configuration fields are:

key-bindings (default: '()) (type: alist)

Association list of readline key bindings to be added to the ~/.inputrc file.

'((\"Control-l\" . \"clear-screen\"))

turns into

Control-l: clear-screen
variables (default: '()) (type: alist)

Association list of readline variables to set.

'((\"bell-style\" . \"visible\")
  (\"colored-completion-prefix\" . #t))

turns into

set bell-style visible
set colored-completion-prefix on
conditional-constructs (default: '()) (type: alist)

Association list of conditionals to add to the initialization file. This includes $if, else, endif and include and they receive a value of another home-inputrc-configuration.

(conditional-constructs
 `((\"$if mode=vi\" .
     ,(home-inputrc-configuration
        (variables
         `((\"show-mode-in-prompt\" . #t)))))
   (\"$else\" .
     ,(home-inputrc-configuration
        (key-bindings
         `((\"Control-l\" . \"clear-screen\")))))
   (\"$endif\" . #t)))

turns into

$if mode=vi
set show-mode-in-prompt on
$else
Control-l: clear-screen
$endif
extra-content (default: "") (type: text-config)

Extra content appended as-is to the configuration file. Run man readline for more information about all the configuration options.


Next: Scheduled User’s Job Execution, Previous: Essential Home Services, Up: Home Services   [Contents][Index]