附录 A. 建立 .xinitrc/.xsession

Verin 撰写

xinit 的地位

窗口管理器只是又一个 X11 应用程序而已,就像 netscapegimpxterm 那样。许多刚刚接触 X11 的人以为是 X11 在执行窗口管理器,窗口管理器再执行其它程序。但这种看法是 其实是错误的。如果配置得当的话,您可以在运行各个应用程序的同时,退出正在使用的 窗口管理器,再运行另一个窗口管理器。

X11 真正执行的程序,也就是用于执行其它程序的, 是您的 .xinitrc.xsession 脚本。在启动 X11 的时候, .xinitrc.xsession 脚本就开始运行,当脚本运行完毕后,X11 也就完成使命了。鉴于它的重要性,我再重复一次: .xinitrc 执行完毕之时,也就是 X11 结束使命之日。 窗口管理器 是否退出与此毫无干系。

脚本布局

好吧,首先回顾一下您已经了解的知识。 在 shell 中敲入一条命令后,您就什么事都做不了了,除非等到该命令 执行完毕并退出。您的 .xinitrc.xsession 脚本也是如此。当脚本开始执行时, 凡遇到任何一个需要很长时间运行的程序(多数 X11 程序都是这样的), 它就停在那儿等到该程序执行完毕为止。

理想情况下,脚本里应该只有一处使得 X11 挂起。并且您多半都希望它位于脚本的末端。 所以,如果您希望 X11 下的程序在未到达此“挂起点”前先运行,您应该将它们置于后台。 即在行尾添上一个&。假设在运行其它程序的同时,您 还想执行 xclock,将下面这行放在“挂起点“之前:

    xclock &

接下来就是您所看到的那个 exec 玩意儿, 很多参考资料在讲解如何将窗口管理器时添加到脚本中时都谈到了它。 但老实说,并不是非要它不可。如果您把窗口管理器放到脚本的最末端,即使不用 exec,X11 也会自动挂起。

那么要 exec 还有什么用呢?好吧,比方说您要在脚本里 放置多个窗口管理器的启动行,但只想使用一个。那么,您就可以利用 exec 将所选的启动行放到其它启动行前面。因为 exec 的意思就是:

"用这个程序代替我,换言之,启动这个程序,等它一结束马上就终止我自己。"

您要是把 exec wmaker 放到 exec enlightenment 的前面,那么当 wmaker 结束后,脚本也就执行完毕了,而不会继续执行下一行。

如果说不必要的话,您懂我的意思吗?用一组注释的窗口管理器启动行,也可以实现刚才的功能。

Another way to do things

As an alternative, 您可以启动窗口管理器,然后将它的进程 ID 保存到某个环境变量中:

        wmaker & wmpid=$!

上面这一句代码将 wmaker 置于后台(&)运行 并将其进程 ID($!)保存到变量(wmpid)中。 之后要构造“挂起点”时,只需 wait

    wait $wmpid

要么也可以把您想要挂起的程序,如 gkrellm 之类的,置于前台来达到目的。 但要记住,当此程序一结束,X11 会话也就关闭了。

现在,我采用的是 wait 方法,因为我想在执行 dockapps 等等程序前 先执行我的窗口管理器。同样,在做其它事之前,我想先更改一下 X11 服务器的设置,比如 dpms,屏保,甚至是 扩充一下我的字体路径内容(安装一些我不想让别人使用的字体)。然后万事俱备后,我还想清理一下我的字体路径, 主要是因为在运行 display 管理器的时候,重置字体路径的效果一直不太好。

例子 A.1. .xinitrc

    # turn off screen blanking and turn on energy star features
    xset s off
    xset dpms 600 60 60

    # add my optional fonts to the font path
    xset +fp "$X_FONTPATH"
    xset fp rehash

    # export the current environment, in case it needs to be debugged
    env > ~/.xenv

    # window manager
    fluxbox & wmpid=$!

    bbrun &
    wmCalClock &
    wmxmms &

    # HANG POINT - wait for window manager to exit
    wait $wmpid

    # restore the x fontpath
    xset fp default