DWM (6.2) 似乎正在使用额外的参数启动我的命令,我不知道为什么。我几乎有一个库存 config.h 文件,我所做的唯一更改是添加额外的命令和键绑定。两个例子:当我启动 Dolphin 时,我希望它只执行“/usr/bin/dolphin”,但它似乎执行“/usr/bin/dolphin /home/myuser/st/”,这会导致 Dolphin 启动,但在一个不存在的目录。当我启动 Firefox 时,有一堆额外的选项卡,其中包含“/usr/bin/terminator”、“/usr/bin/spotify”等位置,基本上是我与其他键绑定绑定的其他命令。我对 C 的了解非常有限,我尝试研究 dwm.c 中的“spawn”函数,但我并不完全理解它。这是我的 config.h 文件的相关部分。谢谢大家。
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
static const char *termcmd[] = { "st", NULL };
static const char *dolphin[] = {"/usr/bin/dolphin"};
static const char *terminator[] = {"/usr/bin/terminator"};
static const char *firefox[] = {"/usr/bin/firefox"};
static const char *spotify[] = {"/usr/bin/spotify"};
/* ########## Custom Commands : End ########## */
/* ########## Key Bindings : Start ########## */
static Key keys[] = {
/* Format = {modifier, key, function, {argument}} */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{MODKEY|ShiftMask, XK_e, spawn, {.v = dolphin}},
{MODKEY|ShiftMask, XK_t, spawn, {.v = terminator}},
{MODKEY|ShiftMask, XK_i, spawn, {.v = firefox}},
{MODKEY|ShiftMask, XK_m, spawn, {.v = spotify}},
{ MODKEY, XK_b, togglebar, {0} },
答案1
弄清楚了!因此,在“spawn”函数中,它调用“execvp”(执行命令的函数),如下所示:
int execvp(const char *file, char *const argv[]);
在此默认行中:
static const char *termcmd[] = { "st", NULL };
它有命令“st”和参数“NULL”。我修改了自己的线路来模仿:
static const char *termcmd[] = { "/usr/bin/firefox", NULL };
现在它按预期工作了。
答案2
虽然我没有遇到这个确切的错误,但我确实有一个类似的问题为什么需要以 . 结尾的命令NULL
。虽然原始答案确实解决了“如何使命令在 dwm 上下文中工作”的问题,但它没有回答“为什么需要这样做”的更深层次问题。
对于同样好奇的人来说是与命令有关execvp
。这是手册页的相关部分:
execv()、execvp() 和 execvpe() 函数提供指向以 null 结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。按照惯例,第一个参数应该指向与正在执行的文件关联的文件名。指针数组必须以 NULL 指针终止。
所以这是一个由 dwm 的内部工作施加的限制execvp
,与它无关(这是我最初想要澄清的)。
由于这篇文章最接近于解决互联网上许多不同来源的更深层次问题,我认为为了后代的缘故,在这里提供更多背景信息是有意义的。