我在一家大公司从事软件工作,我对所使用的整体技术几乎没有控制权,因此需要找到能够在我所受限制的情况下工作的解决方案。
我正在做什么:我正在开发一个 UI,允许用户根据他们正在处理的项目启动具有特定环境的 konsole。我们目前有一个命令(我们称之为“setContext”),用户可以在其 konsole 中手动运行带有大量参数的命令。 setContext做了很多工作,设置了很多环境变量。作为限制的一部分,我必须使用 konsole、tcsh 和 setContext 命令。我的 UI 需要做的就是使用正确的参数编写 setContext 命令,打开 konsole,并在用户控制之后为用户运行该命令。
我生成的命令类似于:
konsole -e tcsh -c "setContext --someArgs"
这有效,但会立即关闭控制台。--noclose
启动 konsole 时使用该选项可使其保持打开状态,但不具有交互性。
此问题普遍接受的解决方案是在命令末尾附加;bash
or ,在我的例子中,我将其推断为.;$SHELL
;tcsh
这是以下链接以及许多其他链接中建议的内容:
- https://askubuntu.com/questions/20330/how-to-run-a-script-without-fitting-the-terminal/1209836#1209836
- https://askubuntu.com/questions/46627/how-can-i-make-a-script-that-opens-terminal-windows-and-executes-commands-in-the
- 在终端中运行命令,然后让我输入更多命令
- https://askubuntu.com/questions/484993/run-command-on-anothernew-terminal-window
这几乎有效,因为它确实使控制台保持打开状态。事实上,这是我几周来一直使用的,没有遇到任何问题,但是我们注意到,在再次获取所有初始化文件(~/.cshrc 等)tcsh
之后运行,这会重置.setContext
setContext
这需要为数百个用户工作,并且我无法控制 cshrc 文件,因此我需要找到一种方法来保持 konsole 打开而不再次获取这些文件。我尝试过tcsh -f
,但这并不能保护环境。
我在网上搜索了一下午,但没有找到解决方案。虽然我了解环境和命令,但我不是专家,通常使用 python 工作。我之所以在这里提问,是因为我发现的所有内容要么是上面答案的重新哈希,需要修改 cshrc 文件,要么远远高于我的水平,我无法破译它。
提前致谢。
答案1
在再次获取所有初始化文件(等)
tcsh
之后运行,这会重置由.setContext
~/.cshrc
setContext
您可以通过将环境变量指向包含 a 的其他目录来欺骗tcsh
不读取 ,该目录重置为其原始值,获取用户的或,然后调用您的.~/.cshrc
HOME
.cshrc
HOME
~/.tcshrc
~/.cshrc
setContext
例如,/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,但它成功了。
- https://docs.kde.org/stable5/en/applications/konsole/scripting.html
- https://www.linuxjournal.com/content/start-and-control-konsole-dbus
我想我最终还是会使用user431397的方法,因为qdbus在发送命令时经常会给出警告,可以通过重新编译来删除,但这不是我能做的,而且警告让我很烦。
我在研究dbus时也发现了yakuake
,结果安装在这里,并且用qdbus比konsole更容易控制。