![如果没有以 exec 为前缀,startx 函数/别名的参数有错误](https://linux22.com/image/211523/%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E4%BB%A5%20exec%20%E4%B8%BA%E5%89%8D%E7%BC%80%EF%BC%8Cstartx%20%E5%87%BD%E6%95%B0%2F%E5%88%AB%E5%90%8D%E7%9A%84%E5%8F%82%E6%95%B0%E6%9C%89%E9%94%99%E8%AF%AF.png)
对于上下文,我的文件/目录结构和内容大部分是从 Luke Smith 的点文件中复制的(空米)。此外,代码块中的“...”行不是代码,代表文件中省略的行。
我的~/.zprofile
:
#!/bin/zsh
...
export XINITRC="${XDG_CONFIG_HOME:-$HOME/.config}/x11/xinitrc"
这在我的别名文件中~/.zshrc
来源(~/.config/shell/aliasrc
):
#!/bin/bash
...
esx() { exec startx "$XINITRC" "$@" -- -keeptty >~/xorg.log 2>&1; }
sx() { startx "$XINITRC" "$@" -- -keeptty >~/xorg.log 2>&1; }
(函数命令中的“--”部分用于记录)
看起来~/.config/x11/xinitrc
像这样:
#!/bin/sh
sysresources="/etc/X11/xinit/.Xresources"
userXprofile="${XDG_CONFIG_HOME:-$HOME/.config}/x11/xprofile" # empty file atm
[ -f "$sysresources" ] && xrdb -merge "$sysresources"
xrdb -merge ${XDG_CONFIG_HOME:-$HOME/.config}/x11/xresources & xrdbpid=$!
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
if [ -f "$userXprofile" ]; then
. "$userXprofile"
else
. "$HOME/.xprofile"
fi
[ -n "$xrdbpid" ] && wait "$xrdbpid"
case $1 in
awesome|awesomeWM) exec awesome;;
xfce|xfce4) exec startxfce4;;
openbox) exec openbox;;
esac
基本上,目的是使用我想要用于该特定会话的任何窗口管理器或桌面环境的名称来运行esx
或。sx
它可以正常工作esx
,但sx
会将 $XINITRC 的值传递为~/.config/x11/xinitrc
$1 而不是我选择的 WM/DE。我尝试sx
通过排除第一个参数来“修复”:
sx() { startx "$XINITRC" "${@:2}" -- -keeptty >~/xorg.log 2>&1; }
但 xinitrc 仍然有 $1 作为 $XINITRC。作为创可贴修复,~/.config/x11/xinitrc
如果第一个位置参数是“$XINITRC”,则将其删除:
[ "$1" = "$XINITRC" ] && shift
case $1 in
...
但我讨厌这个解决方案,并且更想知道为什么sx
会搞砸。有谁知道为什么会发生这种情况?