VSCode: 如何在每个终端打开后 运行 命令?

VSCode: How to run a command after each terminal open?

在 Windows 我必须在我打开的每个新终端会话上 运行 命令 start-ssh-agent.cmd。我的开发环境是VSCode,每天新开十几个终端。每个终端打开后,我必须手动 运行 这个命令。

每次我打开一个终端时,有没有办法在终端上运行这个命令?

这可能采用 VSCode 扩展、VSCode 配置(设置)或 Windows 环境配置的形式。

有什么想法吗?

您可以执行以下操作:

"terminal.integrated.shellArgs.windows": ["start-ssh-agent.cmd"]

修改自:https://code.visualstudio.com/docs/editor/integrated-terminal#_shell-arguments

对于使用精彩 cmder 的任何人,您需要在 settings.json

中提供类似于以下内容的内容
{
    "terminal.integrated.shell.windows": "cmd.exe",
    "terminal.integrated.env.windows": {
        "CMDER_ROOT": "C:\path\to\cmder"
    },
    "terminal.integrated.shellArgs.windows": [
        "/k",
        "%CMDER_ROOT%\vendor\bin\vscode_init.cmd"
    ],
}

然后您可以将任何别名添加到 user_aliases.cmd 文件中,这些别名应该已经存在于 %CMDER_ROOT%\config\user_aliases.cmd

如果您使用 PowerShell,您可以将 PowerShell 脚本添加到您的配置文件中,您可以在其中执行您想要的操作。每个开发环境有4个Profile,存储在$Profile:

  • 所有用户所有主机
  • AllUsersCurrentHost
  • CurrentUserAllHosts
  • 当前用户当前主机

例如,使用

在 VSCode 中创建配置文件
code $profile.CurrentUserAllHosts

Some more details

在 Linux 系统上你应该使用:

"terminal.integrated.shellArgs.linux"

在 Windows 和 OSX 上:

terminal.integrated.shellArgs.windows

terminal.integrated.shellArgs.osx

分别

如果您想在每个工作区基础上应用 shellArgs 设置 - 您可以,尽管 documentation 说:

The first time you open a workspace which defines any of these settings, VS Code will warn you and subsequently always ignore the values after that

至少 VSCode 的 1.42 版本会问你这样的问题:

"This workspace wants to set shellArgs, do you want to allow it?"

See issue 19758


在 Linux 上,如果您使用 bash(VSCode 中 shell 的默认值),则有一些细微差别:

  1. "terminal.integrated.shellArgs.linux": ["your_init_script.sh"]
    
    将立即执行脚本并关闭终端。为防止这种情况,您必须使用 $SHELL 命令结束脚本。
    #!/bin/bash
    echo "init"
    export PATH=$PATH:/xxx/yyy/zzz # or do whatever you want
    $SHELL
    
    但是这样你最终会得到一个 subshell。有时这是不可接受的(Read 1) (Read 2)
  2. "terminal.integrated.shellArgs.linux": ["--init-file", "your_init_script.sh"]
    
    将使您留在初始 shell,但不会执行 .bashrc 初始化文件。所以你可能想要 source ~/.bashrc 里面 your_init_script.sh
    #!/bin/bash
    source ~/.bashrc
    echo "init"
    export PATH=$PATH:/xxx/yyy/zzz # or do whatever you want
    
  3. 如果您的存储库中已经有 some_init_script.sh,并且出于某种原因不想将 source ~/.bashrc 添加到其中,您可以使用以下方法:
    "terminal.integrated.shellArgs.linux": ["--init-file", "your_init_script.sh"]
    
    your_init_script.sh:
    #!/bin/bash
    source ~/.bashrc
    source some_init_script.sh
    
    some_init_script.sh:
    #!/bin/bash
    echo "init"
    export PATH=$PATH:/xxx/yyy/zzz # or do whatever you want
    

    在 VSCode 之外,您可以不创建额外的文件。像这样
    bash --init-file <(echo "source ~/.bashrc; source some_init_script.sh")
    
    但我无法将此字符串传递给 terminal.integrated.shellArgs.linux - 它需要以某种方式拆分为数组。 none 我试过的组合有效。

此外,您可以在特定文件夹中打开终端:

terminal.integrated.cwd

更改环境:

"terminal.integrated.env.linux"
"terminal.integrated.env.windows"
"terminal.integrated.env.osx"

甚至可以根据自己的喜好更改终端

terminal.integrated.shell.linux
terminal.integrated.shell.windows
terminal.integrated.shell.osx

terminal.external.linuxExec
terminal.external.osxExec
terminal.external.windowsExec

我实际上找到了一个非常巧妙的 Linux 解决方案。如果您使用像 Bash 这样的 shell,它也应该适用于 Windows。我不确定是否可以使用 vanilla CMD。

将类似的内容添加到您的 .bashrc.zshrc:

#
# Allow parent to initialize shell
#
# This is awesome for opening terminals in VSCode.
#
if [[ -n $ZSH_INIT_COMMAND ]]; then
    echo "Running: $ZSH_INIT_COMMAND"
    eval "$ZSH_INIT_COMMAND"
fi

现在,在您的 VSCode 工作区设置中,您可以像这样设置环境变量:

"terminal.integrated.env.linux": {
    "ZSH_INIT_COMMAND": "source dev-environment-setup.sh"
}

现在脚本“dev-environment-setup.sh”将在所有新的 VSCode 终端 windows.

中自动生成

我在 Windows 上使用以下 powershell:

{
    "terminal.integrated.shellArgs.windows": [
        "-NoExit",
        "-Command", "conda activate ./env"
    ]
}

经过多次试验和错误,以下对我有用OSX:

"terminal.integrated.shellArgs.osx": [
    "-l",
    "-c",
    "source script.sh; bash"
],

对于上下文,我将其与 jupyter notebook 一起使用来设置不能简单地使用 terminal.integrated.env.osx

定义的环境变量

另一个答案很好,但有点过时了。您将在 VSCode 中收到警告。这是我在 linux 上的 XXX.code-workspace 文件中所做的:

    "terminal.integrated.profiles.linux": {
      "BashWithStartup": {
        "path": "bash",
        "args": [
          "--init-file",
          "./terminal_startup.sh"
        ]
      }
    },
    "terminal.integrated.defaultProfile.linux": "BashWithStartup"

一定要确保您的 terminal_startup.sh 脚本是可执行的:

chmod u+x terminal_startup.sh

2021 年 4 月更新后,配置结构已更改。 检查 the documentation.
甚至终端实例之间也有区别。要 运行 Windows 上的文件:

PowerShell

{
  "terminal.integrated.profiles.windows": {
    "My PowerShell": {
      "path": "pwsh.exe",
      "args": ["-noexit", "-file", "${env:APPDATA}PowerShellmy-init-script.ps1"]
    }
  },
  "terminal.integrated.defaultProfile.windows": "My PowerShell"
}

命令提示符

{
  "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"
}