如何使用 zsh 启动 x?

如何使用 zsh 启动 x?

我想zsh在第一次登录时自动启动x。

我添加后

if systemctl -q is-active graphical.target && [[ ! $DISPLAY && $XDG_VTNR -eq 1 ]]; then
  exec startx
fi 

到文件~/.zprofile。但是我需要登录两次,直到 xinit 启动 i3。

顺便说一句,我使用 Arch

我的.xinitrc样子

#!/bin/sh
userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/etc/X11/xinit/.Xresources
sysmodmap=/etc/X11/xinit/.Xmodmap

# merge in defaults and keymaps

if [ -f $sysresources ]; then
    xrdb -merge $sysresources
fi

if [ -f $sysmodmap ]; then
    xmodmap $sysmodmap
fi

if [ -f "$userresources" ]; then
    xrdb -merge "$userresources"
fi

if [ -f "$usermodmap" ]; then
    xmodmap "$usermodmap"
fi

# start some nice programs

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

twm &
xclock -geometry 50x50-1+1 &
xterm -geometry 80x50+494+51 &
xterm -geometry 80x20+494-0 &
# exec xterm -geometry 80x66+0+0 -name login
xrandr --output DP-3 --same-as LVDS-1 
exec i3

答案1

回复很晚,但只是偶然发现了同样的问题,并想为我的用例提供一个快速解决方案,我怀疑它与OP的相同。只是为了澄清一下,这是为了在使用“文本模式”登录后立即启动 Xorg。因此没有像 gdm 或 lightdm 这样的显示管理器。

您所需要做的就是将这些行添加到您的末尾.zshrc

if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then 
  exec startx &>/dev/null 
fi

本质上,如果 Xorg 尚未启动并且您在 tty1 上,那么它所做的就是运行 Xorg(没有所有烦人的输出...)。后者是为了防止 Xorg 在启动时失败并且您需要更改一些配置文件(在我看来非常有用......)。

希望这可以帮助。

注意:您可以在 bash 中使用相同的代码。

答案2

我稍微重新表述一下,希望保持 Q 的精神:

如何通过shell命令启动X?如何在系统启动时执行此操作?

我忽略了你的 systemctl 和大部分 .xinitrc。

最基本的用户命令是xinit.很难确切地说出它的作用。它具有特殊的语义和语法。回答问题:

xinit fvwm确实启动了 x 服务器。

它默认xinit fvwm -- X :0意味着:

使用窗口管理器在显示器“0”上初始化 X SERVER“X”fvwm

它必须如此复杂,因为它很强大。 X 服务器和窗口管理器将 TTY 转变为所谓的 DISPLAY。

如果您只选择xinit,您将获得特殊的仅 xclock 环境。 (当然,没有任何“隐藏”默认值。参见 man xinit。还有 man startx。比较!)。

当然需要xorg.conf配置! (GPU 卡、x 的输入设备)

当然,您需要一个窗口管理器,(最低限度)配置! (fvwm、twm、...)

要自动启动 X via xinit,需要与systemd您的发行版进行一些规划和谈判。超出范围,但仅限目前。

“第一次登录时启动 x”需要(更多)更精确;如果这意味着继续x运行,tty1我至少可以理解它的含义。我看不出与某个 shell(例如 )有多大联系zsh

相关内容