如何打开终端窗口并在 shell 打开后执行命令?

如何打开终端窗口并在 shell 打开后执行命令?

我想要一个命令或脚本使用 bash 打开一个新的 gnome 终端窗口并加载历史文件并保持打开状态

我搜索了如何打开终端并在不关闭终端的情况下执行命令,我找到的答案基本上总结在这个 stackoverflow 答案

基于这些方法,我尝试运行以下命令:

gnome-terminal -e "bash -c 'history -r ~/history.txt; exec $SHELL'"

但是,新窗口中显示的历史记录不是history.txt默认文件.bash_history.我想,自从history -r我正在执行的命令bash以及源文件之后.bashrc,也许.bashrc正在做一些影响我加载的历史记录的事情。

基于此,我尝试了rcfile上面链接的答案中的选项,以便我可以在之后包含命令.bashrc,结果如下rcfile

FILE=~/.bashrc && test -f $FILE && source $FILE
history -c && history -r ~/history.txt

但是,当我运行以下命令时:

gnome-terminal -e "bash --rcfile rcfile"

新航站楼中的历史仍然是 的历史.bash_history。如果我将history命令添加到它rcfile显示历史记录history.txt已加载,所以之后的东西rcfile会覆盖我加载的历史记录

我还发现如果我取消设置HISTFILE变量export HISTFILE=''的末尾rcfile的历史记录history.txt不会被覆盖并有效。但是,我不想取消设置,因为我确实希望在使用新打开的终端时HISTFILE保存历史记录。.bash_history

最后,我-o在 bash 中找到了这个选项,所以我尝试用它做我想做的事情。我rcfile把我的改为:

FILE=~/.bashrc && test -f $FILE && source $FILE
history -c && history -r ~/saved/history.txt
set -o history

并运行以下命令:

bash --rcfile rcfile.txt +o history

我希望运行bashwith+o history能够防止历史记录history.txt被覆盖,而set -o history中的命令rcfile会重新激活 bash 历史记录。然而,这也无法按预期工作,因为历史记录是来自的历史记录history.txt,但随后就不再有历史记录,我必须手动输入set -o history才能使其工作。

所以基本上,我尝试的一切都让我回到了同一个问题:如何使用 bash 打开新终端然后执行命令,就像用户正在输入一样?

另外,我想更好地了解rcfile执行后发生了什么,因为我无法找到任何其他正在获取的相关文件。和有没有办法从命令行禁用该行为

答案1

我设法使用问题中提到的PROMPT_COMMAND变量和文件找到了解决方法。rcfile.txt你可以运行命令

gnome-terminal -e "bash --rcfile rcfile.txt"

其中 的内容rcfile.txt如下:

FILE=~/.bashrc && test -f $FILE && source $FILE

my_init_func() {
    # Insert desired commands here. In my case, history -r history.txt
    PROMPT_COMMAND=`echo $1`
    eval $PROMPT_COMMAND
    unset -f $FUNCNAME
}

PROMPT_COMMAND="my_init_func \'$PROMPT_COMMAND\'"

其作用是获取默认值.bashrc(如果存在),以便保留任何其他终端配置。然后,它定义了一个函数,该函数在调用 bash 中使用的函数时将运行一次PROMPT_COMMAND,然后将取消自身设置并恢复原始PROMPT_COMMAND.

相关内容