bash:打开 gnome-terminal 选项卡时,在 `bash -c` 命令中调用 ~/.bashrc 文件中定义的函数时出现“未找到命令”

bash:打开 gnome-terminal 选项卡时,在 `bash -c` 命令中调用 ~/.bashrc 文件中定义的函数时出现“未找到命令”

我正在尝试做的事情:

  1. 编写一个脚本来打开 3 个选项卡。
  2. cd进入每个选项卡中的不同文件夹(即:运行唯一的命令)。
  3. 让每个标签都有一个唯一的标题

我希望这个脚本能够被编写,这样我就可以单击桌面上的脚本并让它打开终端,就像我日常开发环境所希望的那样。

描述:

我有这个脚本来尝试打开 3 个终端选项卡,并在这些选项卡中运行独特的命令:

打开标签页

#!/bin/bash

gnome-terminal --tab -- bash -c "source $HOME/.bashrc && set-title hey; exec bash"
gnome-terminal --tab -- bash -c "cd ~; exec bash"
gnome-terminal --tab

当我用 运行它时./open_tabs.sh,它会打开 3 个新选项卡,但不幸的set-title是无法设置选项卡标题!我在打开的选项卡中收到此错误:

bash: set-title: command not found

我已经像这样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}
}

我该如何修复它?我试了export好几次source,但就是不知道我做错了什么。

有关的:

  1. 打开具有多个选项卡的终端并执行应用程序,该应用程序为每个选项卡唯一地修改 PS1 变量
  2. https://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal/566383#566383
  3. 打开具有多个选项卡的终端并执行应用程序<== 这正是我真正想要解决的问题,但是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 在启动时读取并执行~/.bashrc,请将其作为交互式 shell 启动:

gnome-terminal --tab -- bash -ic "set-title hey; exec bash"

现在,为什么您在非交互式 shell 中获取文件的方法不起作用?我强烈认为您的~/.bashrc开始是这样的:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

return如果源 shell 中的任何地方都没有“i” $-,即它是一个交互式 shell,那么它将不执行任何操作。$-是一个特殊参数,man bash表示:

-扩展到调用时指定的当前选项标志、内置命令set或 shell 本身设置的标志(例如选项-i)。

相关内容