我是 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
我想到了自己的答案。我认为这是更好的方法,因为:
- 我可以理解。我不是 Bash 专家,也没有给出任何解释更受欢迎的答案对于什么是
...
,,,或${}
-e
@
- 它允许您轻松自定义每个选项卡的标题和命令
- 我是否说过这更容易理解?
请注意,; $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-terminal
和terminator
终端(如果需要,可以扩展以适用于更多终端),并且已在 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”脚本和“打开编程工具.桌面”桌面启动器文件,这两个文件都用于根据您配置快速打开带有所有选项卡的终端。
以下所有信息在此之后都应该有效,但与我在上面存储库中发现的最新更改不同步。请查看那里了解我的最新技术和脚本。
现在,在所有版本的 gnome-terminal 中设置下面这样的选项卡标题都可以工作,因此它在 Ubuntu 16、18、20 及更高版本中都可以正常工作!
请参阅此处以及此答案最底部的参考资料,以获得更多详细信息和进一步理解:https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
请注意,遗憾的是
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.
我将使用一个有趣的自定义
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 文件。因此,关闭并重新打开您的终端,或者调用. ~/.bashrc
或source ~/.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。代码在这里:
- “eRCaGuy_dotfiles/home/README.md”自述文件
- “~/.bash_aliases” 复制代码文件
- “~/.bash_aliases_private” 复制代码文件
- “打开_编程_工具.sh”脚本
- “打开编程工具.桌面”桌面启动器文件
参考:
1. 在创建“新代码”版本的过程中,我请求大家给予帮助:
- bash:打开 gnome-terminal 选项卡时,在 `bash -c` 命令中调用 ~/.bashrc 文件中定义的函数时出现“未找到命令”
- 打开具有多个选项卡的终端并执行应用程序,该应用程序为每个选项卡唯一地修改 PS1 变量
2. 其他:
- https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
- https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
- 如何在不关闭终端的情况下运行脚本?
- https://stackoverflow.com/questions/16618071/can-i-export-a-variable-to-the-environment-from-a-bash-script-without-sourcing-i
- 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
,这个帖子和这个帖子了解这些变化。
我已经测试过这些脚本并且它们可以运行。