在单独的 konsole 中执行命令,然后让用户输入命令

在单独的 konsole 中执行命令,然后让用户输入命令

我在一家大公司从事软件工作,我对所使用的整体技术几乎没有控制权,因此需要找到能够在我所受限制的情况下工作的解决方案。

我正在做什么:我正在开发一个 UI,允许用户根据他们正在处理的项目启动具有特定环境的 konsole。我们目前有一个命令(我们称之为“setContext”),用户可以在其 konsole 中手动运行带有大量参数的命令。 setContext做了很多工作,设置了很多环境变量。作为限制的一部分,我必须使用 konsole、tcsh 和 setContext 命令。我的 UI 需要做的就是使用正确的参数编写 setContext 命令,打开 konsole,并在用户控制之后为用户运行该命令。

我生成的命令类似于:

konsole -e tcsh -c "setContext --someArgs"

这有效,但会立即关闭控制台。--noclose启动 konsole 时使用该选项可使其保持打开状态,但不具有交互性。

此问题普遍接受的解决方案是在命令末尾附加;bashor ,在我的例子中,我将其推断为.;$SHELL;tcsh

这是以下链接以及许多其他链接中建议的内容:

这几乎有效,因为它确实使控制台保持打开状态。事实上,这是我几周来一直使用的,没有遇到任何问题,但是我们注意到,在再次获取所有初始化文件(~/.cshrc 等)tcsh之后运行,这会重置.setContextsetContext

这需要为数百个用户工作,并且我无法控制 cshrc 文件,因此我需要找到一种方法来保持 konsole 打开而不再次获取这些文件。我尝试过tcsh -f,但这并不能保护环境。

我在网上搜索了一下午,但没有找到解决方案。虽然我了解环境和命令,但我不是专家,通常使用 python 工作。我之所以在这里提问,是因为我发现的所有内容要么是上面答案的重新哈希,需要修改 cshrc 文件,要么远远高于我的水平,我无法破译它。

提前致谢。

答案1

在再次获取所有初始化文件(等)tcsh之后运行,这会重置由.setContext~/.cshrcsetContext

您可以通过将环境变量指向包含 a 的其他目录来欺骗tcsh不读取 ,该目录重置为其原始值,获取用户的或,然后调用您的.~/.cshrcHOME.cshrcHOME~/.tcshrc~/.cshrcsetContext

例如,/fake/home用作诱饵主目录:

konsole -e sh -c 'REAL_HOME=$HOME HOME=/fake/home exec tcsh'

包含/fake/home/.cshrc

setenv HOME "$REAL_HOME"
if (-f ~/.tcshrc) then
   source ~/.tcshrc
else if (-f ~/.cshrc) then
   source ~/.cshrc
endif
setContext
# other aliases and initializations

是的,这是一个可怕的拼凑。找到更好的东西;-)

答案2

我想分享的一个可能的解决方法是其他人与我处于相同的情况,即使用qdbus将命令发送到 konsole 的另一个实例。

这可能有点复杂,因为就我而言,我需要知道 Konsole 的 pid,但它成功了。

我想我最终还是会使用user431397的方法,因为qdbus在发送命令时经常会给出警告,可以通过重新编译来删除,但这不是我能做的,而且警告让我很烦。

我在研究dbus时也发现了yakuake,结果安装在这里,并且用qdbus比konsole更容易控制。

相关内容