终端配置文件

终端配置文件是特定于平台的 shell 配置,包括可执行路径、参数和其他自定义设置。默认情况下,会自动检测到几个配置文件,这些配置文件可以进行自定义或添加。

示例配置文件:

{
  "terminal.integrated.profiles.windows": {
    "Custom Init": {
      "path": "pwsh.exe",
      "args": [
         "-noexit",
         "-file",
         "${env:APPDATA}\\PowerShell\\custom-init.ps1"
      ]
    }
  },
  "terminal.integrated.defaultProfile.windows": "Custom Init"
}

您可以在终端配置文件中使用变量,如上例中的APPDATA环境变量所示。在变量参考主题中有一个可用变量的列表。

通过运行终端:选择默认配置文件命令来配置您的默认配置文件,该命令也可以通过新的终端下拉菜单访问。

选择默认配置文件位于新终端按钮下拉菜单的底部

默认的终端配置文件 shell 在 Linux 和 macOS 上默认为 $SHELL,在 Windows 上默认为 PowerShell。VS Code 会自动检测大多数标准 shell,然后可以将其配置为默认 shell。

配置配置文件

要创建一个新的配置文件,请运行终端:选择默认配置文件命令,并在要基于的shell右侧激活配置按钮。这将在您的设置中添加一个新条目,您可以在settings.json文件中手动调整。

可以使用pathsource以及一组可选参数来创建配置文件。source仅在Windows上可用,可用于让VS Code检测PowerShellGit Bash的安装。或者,可以使用直接指向shell可执行文件的path。以下是一些示例配置文件配置:

{
  "terminal.integrated.profiles.windows": {
    "PowerShell -NoProfile": {
      "source": "PowerShell",
      "args": ["-NoProfile"]
    }
  },
  "terminal.integrated.profiles.linux": {
    "zsh (login)": {
      "path": "zsh",
      "args": ["-l"]
    }
  }
}

配置文件中支持的其他参数包括:

  • overrideName: 一个布尔值,指示是否用静态配置文件名称替换检测正在运行的程序的动态终端标题。
  • env: 一个定义环境变量及其值的映射,将变量设置为null以从环境中删除它。可以使用terminal.integrated.env.设置来为所有配置文件配置此选项。
  • icon: 用于配置文件的图标ID。
  • color: 用于设置图标样式的主题颜色ID。

提示: Path、args 和 env 都支持 解析变量

默认配置文件可以通过terminal.integrated.defaultProfile.*设置手动定义。这应该设置为现有配置文件的名称:

{
  "terminal.integrated.profiles.windows": {
    "my-pwsh": {
      "source": "PowerShell",
      "args": ["-NoProfile"]
    }
  },
  "terminal.integrated.defaultProfile.windows": "my-pwsh"
}

提示: 集成终端 shell 以 VS Code 的权限运行。如果您需要以提升(管理员)或不同权限运行 shell 命令,请在终端内使用平台实用程序,例如 runas.exe

移除内置配置文件

要移除内置配置文件并防止其在新终端下拉菜单中显示,请将配置文件的名称设置为null。例如,要移除Windows上的Git Bash配置文件,请使用此设置:

{
  "terminal.integrated.profiles.windows": {
    "Git Bash": null
  }
}

配置任务/调试配置文件

默认情况下,任务/调试功能将使用默认配置文件。如果您的默认配置文件有一个繁重的PowerShell启动脚本或一个不符合POSIX标准的shell,这可能不是理想的选择。要配置仅在调试/任务功能中使用的配置文件,请使用terminal.integrated.automationProfile.设置:

{
  "terminal.integrated.defaultProfile.osx": "fish",
  // Use a fully POSIX-compatible shell and avoid running a complex ~/.config/fish/config.fish
  // for tasks and debug
  "terminal.integrated.automationProfile.osx": {
    "path": "/bin/sh"
  }
}

特定配置文件的快捷键绑定

通过专用键绑定启动具有特定配置文件的终端,可以使用workbench.action.terminal.newWithProfile命令完成。此命令接受一个配置文件名称和可选的位置作为参数。例如,要将Ctrl+Shift+T绑定到使用zsh配置文件打开终端:

{
  "key": "ctrl+shift+t",
  "command": "workbench.action.terminal.newWithProfile",
  "args": {
    "profileName": "zsh",
    "location": "editor"
  }
}

不安全的配置文件检测

某些shell默认安装在非安全路径中,例如在Windows环境中可能被其他用户写入的路径。VS Code仍然会检测到这些shell,但在通过终端:选择默认配置文件命令明确配置之前,不会将它们作为适当的配置文件暴露出来。在配置非安全配置文件时,添加之前会有一个警告:

使用不安全路径(如c:\msys64)的Shell在您可以使用检测到的配置文件之前会显示警告

Cmder

Cmder本身是一个终端,但你可以在VS Code中使用以下配置文件的Cmder shell:

{
  "terminal.integrated.profiles.windows": {
    "cmder": {
      "path": "C:\\WINDOWS\\System32\\cmd.exe",
      "args": ["/K", "C:\\cmder\\vendor\\bin\\vscode_init.cmd"]
    }
  },
  "terminal.integrated.defaultProfile.windows": "cmder"
}

当设置了CMDER_ROOT环境变量时,此配置文件应自动被选取。如果安装在C:\cmder,它也会被检测为不安全的配置文件。您可以参考Cmder的wiki以获取更多信息。

Cygwin

Cygwin本身是一个终端,但你可以在VS Code中使用以下配置文件的Cygwin shell:

{
  "terminal.integrated.profiles.windows": {
    "Cygwin": {
      "path": "C:\\cygwin64\\bin\\bash.exe",
      "args": ["--login"]
    }
  },
  "terminal.integrated.defaultProfile.windows": "Cygwin"
}

当安装在默认路径C:\cygwinC:\cygwin64时,此配置文件应自动检测为不安全配置文件

Git Bash

当VS Code使用bash.exe(shell)而不是git-bash.exe(终端)时,Git Bash的一个限制是历史记录不会在shell会话之间保留。你可以通过将以下内容添加到你的~/.bashrc~/.bash_profile文件中来解决这个问题:

export PROMPT_COMMAND='history -a'

这将导致 shell 在每次打印提示符时调用 history -a,这将把会话的当前会话命令刷新到历史记录文件中。

MSYS2

MSYS2的bash shell可以通过以下配置文件进行配置:

{
  "terminal.integrated.profiles.windows": {
    "bash (MSYS2)": {
      "path": "C:\\msys64\\usr\\bin\\bash.exe",
      "args": ["--login", "-i"],
      "env": { "CHERE_INVOKING": "1" }
    }
  }
}

CHERE_INVOKING 环境变量 用于告诉登录初始化脚本保留工作目录,而不是在 $HOME 处打开。

当安装在默认路径 C:\\msys64 时,此配置文件应自动检测为 不安全配置文件

Windows PowerShell

当安装了PowerShell 6+时,默认情况下,Windows PowerShell不会包含在配置文件列表中。要将Windows PowerShell添加为配置文件,请在新终端下拉菜单中选择选择默认配置文件选项,并选择Windows PowerShell项目。这将配置配置文件并将其设置为默认值。

WSL

当在本地机器上运行 VS Code 时,Windows Subsystem for Linux 的 shell 应该会自动检测到。根据你的设置,如果你安装了很多发行版,这可能会带来一些麻烦。为了更精细地控制 WSL 配置文件,可以通过 terminal.integrated.useWslProfiles 设置来禁用自动检测,然后这里是一个如何手动配置 WSL shell 的示例:

{
  "terminal.integrated.profiles.windows": {
    "Debian (WSL)": {
      "path": "C:\\WINDOWS\\System32\\wsl.exe",
      "args": [
        "-d",
        "Debian"
      ]
    }
  }
}

常见问题

为什么终端中的$PATH环境变量会有重复路径,以及为什么在macOS上它们是反向的?

这可能在macOS上发生,因为终端使用VS Code的环境启动。当VS Code首次启动时,为了获取您的“开发环境”,它会将您配置的shell作为登录shell启动,这会运行您的~/.profile/~/.bash_profile/~/.zprofile脚本。现在当终端启动时,它也会作为登录shell运行,这会将标准路径放在前面(例如,/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin)并重新初始化您的shell环境。

为了更好地理解,您可以通过在操作系统的内置终端中启动一个内部登录shell来模拟正在发生的情况:

# Add /test to the beginning of $PATH
export PATH=/test:$PATH
# Echo $PATH, /test should be at the beginning
echo $PATH
# Run bash as a login shell
bash -l
# Echo $PATH, the values should be jumbled
echo $PATH

不幸的是,与Linux不同,macOS的独立终端默认都作为登录shell运行,因为macOS在用户登录系统时不会运行登录shell。这鼓励了“不良行为”,比如在你的配置脚本中初始化别名,而它们应该放在你的rc脚本中,因为该脚本在非登录shell上运行。

有两种直接的修复方法。第一种是设置"terminal.integrated.inheritEnv": false,这将从终端环境中剥离大多数环境变量,除了一些重要的变量(如HOMESHELLTMPDIR等)。

另一个修复方法是通过创建一个终端配置文件并将其args设置为[],从而不再在终端中运行登录shell。如果你选择这个修复方法,你需要确保将配置文件脚本中的任何别名移动到你的~/.bashrc/~/.zshrc文件中,因为别名只适用于它们被设置的shell。