我正在用 Rust 编写一个终端模拟器。源代码是这里。它分叉自身并且子进程(最终)成为 shell 程序,从中读取输出并将输入传递给该 shell 程序。
在 macOS 上,我所做的是执行login -f adam
(我的用户名是 adam),然后它运行并生成设置了 env 的 shell 程序。
在 Linux 上,我无法做到这一点。login
在 Linux 上需要sudo
。当您启动普通的 Linux 终端程序时,它不会要求您输入密码才能执行sudo
,因此一定是别的原因。我看到 Zsh 有一个-l
标志使其成为“登录 shell”。但这不会设置像这样的重要环境变量$PATH
。
请参阅此截图:
左边是sudo login -f adam
——几乎正确,但它让我输入密码。
正确的是/usr/bin/zsh -l
。它不要求我输入密码,但是没有设置$PATH
或重置$PWD
为/home/adam
,以及许多其他事项。
所以我的问题是,在不执行二进制文件的情况下,普通的 Linux 终端程序如何xterm
启动并设置所有的环境等login
?