从脚本打开新的控制台,执行命令并在结束时进行交互

从脚本打开新的控制台,执行命令并在结束时进行交互

我希望能够获得一个脚本(在启动时运行)来打开终端konsole
当它打开时,它会执行一些持久性操作(例如更改目录和源 bashrc)并运行一个长时间运行的程序。
如果程序崩溃或我进入<ctrl+c>它,它会开始接受来自标准输入的命令(例如“up-enter”重试,好像它一直都是交互式的)。

我尝试了很多方法来让它工作(我目前只是想让它ls在完成后恢复到交互状态);

konsole -e ls
konsole --hold ls
konsole -e /bin/bash -c ls
konsole --hold -e "/bin/bash -c ls"
konsole -e "/bin/bash -i -c ls"
konsole -e /bin/bash -i -c ls
konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"

echo ls > /tmp/konsolebash
konsole -e "/bin/bash -i --rcfile /tmp/konsolebash"

这与引号有关吗?我不应该使用它们,我应该逃避某些事情吗?我
是否应该尝试执行bash
我的想法已经用完了,但我希望这是可以实现的(但希望不是我错过的令人尴尬的简单的事情)。

konsole如果存在特定问题,我会对成功使用其他终端仿真器的答案投赞成票(但由于问题具体是关于konsole我不认为我可以给你多汁的勾选)

答案1

感谢@n.st 的评论,我写了以下这段代码:

konsole -e /bin/bash --rcfile <(echo "cd /;ls;echo hi | less")

这只是一个没有 tmpfiles 的较短版本,使用 bash 进程替换以下内容;

echo "cd /;ls;echo hi | less" > /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash

它将运行一些命令,让它们显示出来,更改环境,运行一个长时间运行的程序(less),并且当它结束时(:q)将是交互式的。
因此,用您的脚本替换cd /;ls;echo hi | less(演示)。

没有历史记录,但至少您现在位于正确的目录中,并且拥有您可能想要设置的任何环境变量。


基本上和我之前的尝试相同;

konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"

除了文件写入在konsole执行之外,我已经删除了-i标志,并且执行参数不在一个引用块中


不幸的是,该--rcfile开关导致您~/.bashrc无法加载这些命令,所以如果您需要别名或类似的东西,你就必须这样做;

cat ~/.bashrc > /tmp/konsolebash; echo "commands" >> /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash

然后只复制你的 .bashrc附加你的命令到它的末尾

答案2

一个更短更简单的解决方案:

konsole -e '$SHELL -c "ls; $SHELL"' &

这个也没有历史或来源问题.bashrc。如果您的$SHELL环境变量没有指向 bash,您可以手动指定它。

这确实会在同一个终端窗口内产生第二个(bash)shell,因此第一个命令中的一些内容可能不会被延续。

答案改编自 askubuntu回答

相关内容