旧版本[我建议使用下面的新版本]:

旧版本[我建议使用下面的新版本]:

我是 Linux Shell 脚本的新手。我想编写一个 Shell 脚本,该脚本将打开具有多个选项卡的终端;它应该在每个选项卡中运行 rtsp 客户端应用程序。

为此,我在这个论坛上回答了问题,并尝试编写如下代码,

tab="--tab-with-profile=Default -e "
cmd="java RunRTSPClient"
for i in 1 2 3 4 5
   do
#   
   foo="$foo $tab $cmd"         
   done
gnome-terminal $foo
exit 0

它正在运行并打开带有选项卡的终端窗口,但突然它会关闭。我没有收到任何错误。

答案1

我想到了自己的答案。我认为这是更好的方法,因为:

  1. 我可以理解。我不是 Bash 专家,也没有给出任何解释更受欢迎的答案对于什么是...,,,或${}-e@
  2. 它允许您轻松自定义每个选项卡的标题和命令
  3. 我是否说过这更容易理解?

请注意,; $SHELL每个 gnome-terminal 命令末尾的 是保持终端窗口打开的按钮。否则它会立即关闭。

旧版本[我建议使用下面的新版本]:

  • 适用于旧版本gnome-terminal,例如 Ubuntu 14.04。
  • gnome-terminal在版本 3.16.2 或之后的某个时候禁用了该--title选项(参见 Ivan Kozik 的评论在这个答案下,并参见我的回答下面的评论),但是,尽管下面的脚本的其余部分仍然适用于现代版本gnome-terminal和 Ubuntu,但设置每个选项卡的标题却--title不行。请参阅下面的新版本,了解可在任何地方使用的替代方案。

旧代码(在 Ubuntu 16 或 18 或更高版本中,像这样设置选项卡标题不再起作用,--command不幸的是该选项现在也已被弃用):

title1="tab 1"
title2="tab 2"
title3="tab 3"

cmd1="cd /etc"
cmd2="cd ~/Documents"
cmd3="cd /usr/local"

gnome-terminal --tab --title="$title1" --command="bash -c '$cmd1; $SHELL'" \
               --tab --title="$title2" --command="bash -c '$cmd2; $SHELL'" \
               --tab --title="$title3" --command="bash -c '$cmd3; $SHELL'" 

新版本 [使用这个!](2020 年 2 月 7 日至 11 日添加):


新代码——适用于所有版本的gnome-terminalterminator终端(如果需要,可以扩展以适用于更多终端),并且已在 Ubuntu 14.04、16.04、18.04 和 20.04 中测试过。您可以在我的个人博客中找到最新和最好的版本“~/.bash_aliases” 复制代码“〜/ .bash_aliases_private文件在我的 dotfiles 项目中。 阅读自述并搜索“~/.bash_aliases”文件参见“自定义终端标签和标题”部分。“~/.bash_aliases_private”文件,搜索名为“Bash 函数配置”的部分gs_open_default_tabs。另请参阅“打开_编程_工具.sh”脚本和“打开编程工具.桌面”桌面启动器文件,这两个文件都用于根据您配置快速打开带有所有选项卡的终端。

以下所有信息在此之后都应该有效,但与我在上面存储库中发现的最新更改不同步。请查看那里了解我的最新技术和脚本。


  1. 现在,在所有版本的 gnome-terminal 中设置下面这样的选项卡标题都可以工作,因此它在 Ubuntu 16、18、20 及更高版本中都可以正常工作!

  2. 请参阅此处以及此答案最底部的参考资料,以获得更多详细信息和进一步理解:https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383

  3. 请注意,遗憾的是gnome-terminal --command( -e) 和--title选项现已弃用,因此需要采取这种困难的解决方法。如果我gnome-terminal从命令行调用其中一个弃用的选项,则会收到以下警告:

     # Option “--command” is deprecated and might be removed in a later version of gnome-terminal.
     # Use “-- ” to terminate the options and put the command line to execute after it.
    
  4. 我将使用一个有趣的自定义set-title函数,其中对 ed 变量和 ~/.bashrc 文件进行一些特殊使用,因为每次打开export交互式 () bash shell 时它都会自动执行。-i

首先,将其添加到文件底部~/.bashrc

根据需要更新DEFAULT_TABS_TITLE和变量。DEFAULT_TABS_CMD

# Function to allow a user to arbitrarily set the terminal title to anything
# Example: `set-title this is title 1`
set-title() {
    # Set the PS1 title escape sequence; see "Customizing the terminal window title" here: 
    # https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
    TITLE="\[\e]2;$@\a\]" 
    PS1=${PS1_BAK}${TITLE}
}

# Back up original PS1 Prompt 1 string when ~/.bashrc is first sourced upon bash opening
if [[ -z "$PS1_BAK" ]]; then # If length of this str is zero (see `man test`)
    PS1_BAK=$PS1 
fi

# Set the title to a user-specified value if and only if TITLE_DEFAULT has been previously set and
# exported by the user. This can be accomplished as follows:
#   export TITLE_DEFAULT="my title"
#   . ~/.bashrc
# Note that sourcing the ~/.bashrc file is done automatically by bash each time you open a new bash 
# terminal, so long as it is an interactive (use `bash -i` if calling bash directly) type terminal
if [[ -n "$TITLE_DEFAULT" ]]; then # If length of this is NONzero (see `man test`)
    set-title "$TITLE_DEFAULT"
fi

DEFAULT_TABS_TITLE1="tab 1"
DEFAULT_TABS_TITLE2="tab 2"
DEFAULT_TABS_TITLE3="tab 3"

DEFAULT_TABS_CMD1="cd /etc"
DEFAULT_TABS_CMD2="cd ~/Documents"
DEFAULT_TABS_CMD3="cd '$HOME/temp/test folder'" # Use quotes like this if there are spaces in the path

open_default_tabs() {
    gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='$DEFAULT_TABS_TITLE1'; $DEFAULT_TABS_CMD1; exec bash;"
    gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='$DEFAULT_TABS_TITLE2'; $DEFAULT_TABS_CMD2; exec bash;"
    gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='$DEFAULT_TABS_TITLE3'; $DEFAULT_TABS_CMD3; exec bash;"
}

# If length of this is NONzero
if [[ -n "$OPEN_DEFAULT_TABS" ]]; then
    OPEN_DEFAULT_TABS= # reset to an empty string so this only happens ONCE
    open_default_tabs
    exit 0 # close the calling process so only the "default tabs" are left open
fi

第二,open_default_tabs从任意终端调用该功能。

由于您刚刚更新了 ~/.bashrc 文件,因此您需要让终端知道它,然后它才能让您访问新的函数和特性。您需要“重新获取”您的 ~/.bashrc 文件。因此,关闭并重新打开您的终端,或者调用. ~/.bashrcsource ~/.bashrc重新获取您的 ~/.bashrc 文件。然后,只需调用open_default_tabs,您就会神奇地打开和命名所有想要的选项卡,并将cd其放入您设置的目录中,就像这样!

在此处输入图片描述

第三(可选),创建一个脚本和桌面文件,以便您只需双击桌面文件即可加载这些选项卡。

打开标签页

# Export this variable so your ~/.bashrc file will see it and do the magic.
export OPEN_DEFAULT_TABS=true
# Open a new terminal window, which by default also sources your ~/.bashrc file again, 
# thereby kicking off the process since you set the `OPEN_DEFAULT_TABS` variable just above.
gnome-terminal 
OPEN_DEFAULT_TABS=      # set this variable back to an empty string so it's no longer in force
unset OPEN_DEFAULT_TABS # unexport it

打开标签页.桌面

[Desktop Entry]
Name=Open Tabs
Name[en_US]=Open Tabs
Comment=
Exec=/path/to/open_tabs.sh
Icon=terminal
Terminal=false
Type=Application
StartupNotify=true

然后做:

chmod +x open_tabs.sh
chmod +x open_tabs.desktop

将 open_tabs.desktop 放在桌面上并双击它。

瞧!太神奇了!您将获得一个新的终端窗口,其中有 3 个标题选项卡,每个选项卡都位于您根据在 ~/.bashrc 文件中配置的命令设置的正确目录中。

下载此内容及更多内容:

请注意,此代码以及更多有用的配置设置和脚本已放入我的点文件项目中:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles。代码在这里:

  1. “eRCaGuy_dotfiles/home/README.md”自述文件
  2. “~/.bash_aliases” 复制代码文件
  3. “~/.bash_aliases_private” 复制代码文件
  4. “打开_编程_工具.sh”脚本
  5. “打开编程工具.桌面”桌面启动器文件

参考:

1. 在创建“新代码”版本的过程中,我请求大家给予帮助:

  1. bash:打开 gnome-terminal 选项卡时,在 `bash -c` 命令中调用 ~/.bashrc 文件中定义的函数时出现“未找到命令”
  2. 打开具有多个选项卡的终端并执行应用程序,该应用程序为每个选项卡唯一地修改 PS1 变量

2. 其他:

  1. https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
  2. https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
  3. 如何在不关闭终端的情况下运行脚本?
  4. https://stackoverflow.com/questions/16618071/can-i-export-a-variable-to-the-environment-from-a-bash-script-without-sourcing-i
  5. https://www.shellscript.sh/variables1.html

回复以下评论

致@egmont:
回答你的问题:这是我这样做时得到的结果:gnome-terminal --tab --title abc -e 'sleep 10' --tab --title def -e 'sleep 10'

$ gnome-terminal --tab --title abc -e 'sleep 10' --tab --title def -e 'sleep 10'
# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
# Use “-- ” to terminate the options and put the command line to execute after it.
# Option “-e” is deprecated and might be removed in a later version of gnome-terminal.
# Use “-- ” to terminate the options and put the command line to execute after it.

然而,立即打开 2 个新标签页,标题设置为美国广播公司定义。然而,约 10 秒后,标签会自动关闭并且不会保持打开状态。

答案2

使用这个脚本的变体来做你想做的事情:

#!/bin/bash

tab="--tab-with-profile=Default"
cmd="bash -c 'java RunRTSPClient';bash"
foo=""

for i in 1 2 3 4 5; do
      foo+=($tab -e "$cmd")         
done

gnome-terminal "${foo[@]}"

exit 0

一般来说,像这样的脚本:

#!/bin/bash

tab="--tab"
cmd="bash -c '<command-line_or_script>';bash"
foo=""

for i in 1 2 ... n; do
      foo+=($tab -e "$cmd")         
done

gnome-terminal "${foo[@]}"

exit 0

将打开一个带有 n 个选项卡的新终端,并<command-line_or_script>在每个选项卡中执行。例如,当您想打开一个带有一些选项卡的终端,并在特定路径上使用解释器时(cd /path在上述脚本中使用),这会非常有用。

另外,请阅读man bash这个帖子这个帖子了解这些变化。

我已经测试过这些脚本并且它们可以运行。

相关内容