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