我正在尝试做的事情:
- 编写一个脚本来打开 3 个选项卡。
cd
进入每个选项卡中的不同文件夹(即:运行唯一的命令)。PS1
通过修改局部变量让每个选项卡都有唯一的标题- 确保脚本运行后每个选项卡保持打开状态
我希望这个脚本能够被编写,这样我就可以单击桌面上的脚本并让它打开终端,就像我日常开发环境所希望的那样。
描述:
我有这个脚本来尝试打开 3 个终端选项卡,并在这些选项卡中运行独特的命令:
打开标签页
#!/bin/bash
gnome-terminal --tab -- bash -ic "set-title title 1; exec bash"
gnome-terminal --tab -- bash -ic "cd ~; set-title title 2; exec bash"
gnome-terminal --tab
当我用 运行它时./open_tabs.sh
,它会打开 3 个新选项卡,但不幸的set-title
是无法设置选项卡标题!似乎变量PS1
没有在我的set-title
调用中保持设置。exec bash
是用来保持选项卡打开的,根据这个答案和下面的评论。
我已经像这样set-title
定义了一个函数~/.bashrc
。其目的是将标题字符串设置在任意终端窗口的顶部。当我手动使用它时,它工作得很好。例如:set-title hey how are you?
将“嘿,你好吗?”放在我的终端窗口的顶部。
# From: https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
set-title() {
# If the length of string stored in variable `PS1_BAK` is zero...
# - See `man test` to know that `-z` means "the length of STRING is zero"
if [[ -z "$PS1_BAK" ]]; then
# Back up your current Bash Prompt String 1 (`PS1`) into a global backup variable `PS1_BAK`
PS1_BAK=$PS1
fi
# Set the title escape sequence string with this format: `\[\e]2;new title\a\]`
# - See: https://wiki.archlinux.org/index.php/Bash/Prompt_customization#Customizing_the_terminal_window_title
TITLE="\[\e]2;$@\a\]"
# Now append the escaped title string to the end of your original `PS1` string (`PS1_BAK`), and set your
# new `PS1` string to this new value
PS1=${PS1_BAK}${TITLE}
}
我该如何解决这个问题,以便每个选项卡运行一个命令,通过修改其PS1
变量来设置其标题,并保持打开状态?
请注意,gnome-terminal
已经弃用其--title
和--command
选项,因此采用这些解决方法。
有关的:
- bash:打开 gnome-terminal 选项卡时,在 `bash -c` 命令中调用 ~/.bashrc 文件中定义的函数时出现“未找到命令”
- https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
打开具有多个选项卡的终端并执行应用程序<== 这正是我真正想要解决的问题,但是
gnome-terminal
(--command
)-e
选项现在已被弃用!# 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.
答案1
与大多数编程一样,解决这个问题非常困难。我不得不研究大量有关 Bash 变量的知识,以及如何使用export
and source
(或 POSIX 点运算符.
),以及 bash 如何加载,什么-i
是交互式 bash 模式等等。
我发现man bash
也man test
很有用。下面是我想做的事情:
- 编写一个脚本来打开 3 个选项卡。
- cd 进入每个选项卡中的不同文件夹(即:运行唯一的命令)。
- 通过修改本地 PS1 变量,让每个选项卡都有唯一的标题
- 确保脚本运行后每个选项卡保持打开状态
首先,将其添加到文件底部~/.bashrc
:
# 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
第二,创建此脚本以使用 3 个唯一的 cd 命令和 3 个唯一的标题打开 3 个唯一的选项卡:
打开标签页:
gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='title 1'; cd ..; exec bash;"
gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='title 2'; cd ../..; exec bash;"
gnome-terminal --tab -- bash -ic "export TITLE_DEFAULT='title 3'; cd ../../..; exec bash;"
现在打开终端并运行open_tabs.sh
脚本:
./open_tabs.sh
瞧!太神奇了!这 3 个新选项卡现在显示在我的终端顶部,每个选项卡都执行了cd
我设置的正确命令,并且每个选项卡都有我设置的正确标题!
这些都将被放入我的 dotfiles 项目中:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles。
完整且最终的解决方案:请参见此处:打开具有多个选项卡的终端并执行应用程序
答案2
我认为您应该使用&
它让您的进程在后台运行。
https://www.tecmint.com/run-linux-command-process-in-background-detach-process/