我想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
。