# xinitrc (简体中文)

相关文章

- Display manager (简体中文)
- Start X at Login (简体中文)
- Xorg_(简体中文)
- Xprofile_(简体中文)
- Xresources

翻译状态： 本文是英文页面 Xinitrc 的翻译，最后翻译时间：2016-08-04，点击这里可以查看翻译后英文页面的改动。

`~/.xinitrc` 文件是 `xinit` 和它的前端 `startx` 第一次启动时会读取的脚本。通常用在启动 X 时执行窗口管理器 和其他程序，例如启动守护进程和设置环境变量。`xinit`程序用来启动X窗口系统，是不使用显示管理器时的第一个客户端。

`~/.xinitrc` 一个主要功能是根据单个用户的设置决定 `/usr/bin/startx` 或 `/usr/bin/xinit` 程序启动的窗口系统。`~/.xinitrc` 中还可以加入许多系统定制选项。大部分显示管理器也会在 xinit 前读取相似的 xprofile 文件。

## 安装

安装 软件包 xorg-xinit. 此软件包提供了 xinit、startx和默认的 xinitrc 文件。

## 配置

### xserverrc

`xserverrc` 文件是一个启动 X server 的 shell 脚本。如果存在 `~/.xserverrc` ，startx 和 xinit 都会执行这个文件。如果文件不存在，startx 会使用 `/etc/X11/xinit/xserverrc`.

为了维护 `logind` 的 authenticated session|会话认证，避免切换终端时跳过屏幕锁， 必须找用户登录的虚拟终端启动 Xorg。[1] 所以建议在 `~/.xserverrc` 中指定 `vt$XDG_VTNR`:

    ~/.xserverrc

    #!/bin/sh
    exec /usr/bin/Xorg -nolisten tcp "$@" vt$XDG_VTNR

如果要让 X 在其他的终端启动，可以使用 `/usr/lib/systemd/systemd-multi-seat-x` 提供的 X server 包裹程序。修改 `~/.xserverrc`，可以让 xinit 和startx 都使用这个包裹程序.

### xinitrc

如果用户主目录中存在 `.xinitrc`，startx 和 xinit 会执行此文件。如果不存在，startx 会执行默认的 `/etc/X11/xinit/xinitrc`。这个文件默认启动 Twm 和 Xterm. xinit 的默认行为不一样，请参阅 `man 1 xinit`。要设置窗口管理器或桌面环境，先通过复制创建默认文件：

    $ cp /etc/X11/xinit/xinitrc ~/.xinitrc

根据示例文件修改可以保留一些默认行为，例如会引用 `/etc/X11/xinit/xinitrc.d` 中以 `.sh` 结尾的脚本。

然后编辑 `~/.xinitrc` ，例如要使用 Openbox，修改为：

    #!/bin/sh
    #
    # ~/.xinitrc
    #
    # Executed by startx (run your window manager from here)
    ...

    if [ -d /etc/X11/xinit/xinitrc.d ] ; then
        for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do
            [ -x "$f" ] && . "$f"
        done
        unset f
    fi

    # exec gnome-session
    # exec startkde
    # exec startxfce4
    # exec wmaker
    # exec icewm
    # exec blackbox
    # exec fluxbox
    # exec openbox-session
    # ...or the Window Manager of your choice

    ## some applications that should be run in the background
    xscreensaver &
    xsetroot -cursor_name left_ptr &
    exec openbox-session

`~/.xinitrc` 中应该只有 一个 未注释掉的 `exec` 行，而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令应该用 & 在后台启动, 否则启动程序会等待它们退出。使用 `exec` 作为前缀会替换当前的进程，这样进程进入后台时 X 不会退出。

## 使用

现在以普通用户启动 X：

     $ startx

或者

    $ xinit -- :1

Note: xinit 无法在其它 X server 启动时处理多个显示，要使用多显示，需要通过 `-- :display_number` 指定，`display_number` 是 1 或更高的数值。

选择的窗口管理器或桌面环境就应该正常启动了.

要退出 X, 运行窗口管理器的退出功能，如果窗口管理器未提供此功能，可以运行：

    $ pkill -15 Xorg

Note: pkill 会杀死所有 X 实例，如果仅希望杀死当前虚拟终端的窗口管理器，运行：

    $ pkill -15 -t tty"$XDG_VTNR" Xorg

`xprop` 是软件包 xorg-xprop提供的。

## 在启动的时候自动启用X

先确保 startx 已经配置好了。

注意: 这种方式将在登陆 tty 启动 X，只有这样才能保持登录会话。

如果使用Bash, 编辑 `~/.bash_profile`,加入如下内容. 如果文件不存在，从 `/etc/skel/.bash_profile` 复制一个框架版本。

如果使用 zsh，则编辑 `~/.zprofile`.

    [ -z "$DISPLAY" -a "$(fgconsole)" -eq 1 ] && exec startx

注意:

- 如果想在多个 VT 上使用图形登陆，可以将`-eq 1`修改为`-le 3` (vt1 到 vt3)
- 如果希望在 X 会话终止时保持登入状态，删除 `exec`.

- 此方法与automatic login to virtual console一起可以实现自动登陆。
- 如果 X 被关闭，用户将自动退出。要避免这个问题，删除 `exec`。
- 要将 X 会话的输出重定向到一个文件，请创建一个别名alias:

      alias startx='startx &> ~/.xlog'

参阅 Fish#Start X at login 和 Systemd/User#Automatic login into Xorg without display manager.

### 自动登录到虚拟终端

可以和 自动登录到虚拟终端一起使用.

## 提示和技巧

### 从命令行覆盖 xinitrc

如果你有一个可用的 `~/.xinitrc`, 件，只想尝试下其他的窗口管理器/桌面环境，你可从命令行给 `startx` 完整路径

    $ startx /full/path/to/window-manager

Note that the full path is required. Optionally, you can also specify custom options for #xserverrc script by appending them after `--`, e.g.:

     $ startx /usr/bin/enlightenment -- -br +bs -dpi 96

参阅 `man startx`.

### Making a DE/WM choice

If you are frequently switching between different DEs/WMs, it is recommended to either use a Display manager or add code to `.xinitrc`. The code described next consists of a simple few lines, which will take the argument and load the desired desktop environment or window manager.

The following example `~/.xinitrc` shows how to start a particular DE/WM with an argument:

    ~/.xinitrc

    ...

    # Here Xfce is kept as default
    session=${1:-xfce}

    case $session in
        awesome           ) exec awesome;;
        bspwm             ) exec bspwm;;
        catwm             ) exec catwm;;
        cinnamon          ) exec cinnamon-session;;
        dwm               ) exec dwm;;
        enlightenment     ) exec enlightenment_start;;
        ede               ) exec startede;;
        fluxbox           ) exec startfluxbox;;
        gnome             ) exec gnome-session;;
        gnome-classic     ) exec gnome-session --session=gnome-classic;;
        i3|i3wm           ) exec i3;;
        icewm             ) exec icewm-session;;
        jwm               ) exec jwm;;
        kde               ) exec startkde;;
        mate              ) exec mate-session;;
        monster|monsterwm ) exec monsterwm;;
        notion            ) exec notion;;
        openbox           ) exec openbox-session;;
        unity             ) exec unity;;
        xfce|xfce4        ) exec startxfce4;;
        xmonad            ) exec xmonad;;
        # No known session, try to run it as command
        *) exec $1;;
    esac

After that, you can easily start a particular DE/WM by passing an argument, e.g.:

    $ xinit
    $ xinit gnome
    $ xinit kde
    $ xinit wmaker

or

    $ startx
    $ startx ~/.xinitrc gnome
    $ startx ~/.xinitrc kde
    $ startx ~/.xinitrc wmaker

### 不启动窗口管理器，直接启动程序

It is possible to start only specific applications without a window manager, although most likely this is only useful with a single application shown in full-screen mode. For example:

    ~/.xinitrc

    ...

    exec chromium

With this method you need to set each application window's geometry through its own configuration files, if possible at all.

Tip: This method can be useful to launch graphical games, especially on systems where excluding the memory or CPU usage of a window manager or desktop environment, and possible accessory applications, can help improve the game's execution performance.

See also Display manager#Starting applications without a window manager.

Categories:

- Desktop environments (简体中文)
- X server (简体中文)