终端 > Warp 化概览
Warpify 子 Shell
# Warpify 子 Shell import DemoVideo from '@components/DemoVideo.astro'; import { Tabs, TabItem } from '@astrojs/starlight/components'; ## 什么是子 Shell? 在 Warp 的语境下,“子 Shell” 被定义为在现有运行中的 Shell 环境中产生并运行的任何嵌套交互式 Shell 会话。这可以是运行在本地机器上的嵌套会话、运行在 Docker 容器内的 Shell 会话,或者通过 SSH 访问的远程服务器。[查看更多关于 SSH Warpification 的内容](/terminal/warpify/ssh/)。 请注意,Warp 对子 Shell 的定义与常见的 Unix 子 Shell 定义有所不同,后者通常指作为交互式 Shell 的子进程产生的任何 Shell 进程。例如,在 bash 中,用括号括起来的命令是在具有自己的 PID 和可寻址内存空间的子 Shell 中执行的。 ## 如何 Warpify 子 Shell 默认情况下,Warp 自动将以下命令识别为 **子 Shell 兼容**: * bash, fish, zsh * docker exec * gcloud compute ssh * eb ssh * poetry shell 当您运行兼容子 Shell 的命令时,Warp 将通过提示邀请您 “Warpify” 该子 Shell,从而使 Warp 的所有现代 IDE 功能在该子 Shell 中可用。子 Shell 兼容命令列表可在下文所述的[子 Shell 设置](/terminal/warpify/subshells/#configuring-subshell-compatible-commands)中进行配置。 :::note 必须在容器和 ssh 会话中将 bash、zsh 或 fish (3.6 或更高版本) 设置为默认 Shell,子 Shell 的 Warpification 才能正常工作。 ::: <DemoVideo src="/assets/terminal/subshells-demo.mp4" label="Subshells 演示" /> ### 配置子 Shell 兼容命令 要配置子 Shell 兼容命令,请导航至 **Settings** > **Warpify** > **Subshells**。 #### 添加兼容命令 您可以将任何产生 bash、fish 或 zsh 子 Shell 的命令添加到 “Added commands” 中,使其符合 “Warpification” 条件。此外,您还可以向 “Added commands” 列表添加正则表达式。任何匹配已添加正则表达式的命令都将符合 “Warpification” 条件。 #### 将命令加入阻止名单 某些类型的子 Shell 不兼容,您可能还希望控制 Warp 永远不要邀请您对特定命令的子 Shell 进行 “Warpify”。当您将命令添加到 Blocklist 时,Warp 将永远不会邀请您 Warpify 由这些命令产生的子 Shell。 ### 自动 “Warpify” 子 Shell 要记住您对某个命令的偏好并跳过确认横幅,您可以手动将相应的代码段粘贴到子 Shell (bash、fish 或 zsh) 对应的 RC 文件末尾。 ```bash # 对于 zsh 子 Shell,添加到 ~/.zshrc。 printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "zsh"}}\x9c' # 对于 bash 子 Shell,添加到 ~/.bashrc 或 ~/.bash_profile。 printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "bash"}}\x9c' # 对于 fish 子 Shell,添加到 ~/.config/fish/config.fish。 if status is-interactive printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "fish"}}\x9c' end ``` 添加后,Warp 将在具有最新更新 RC 文件的机器上自动为相应的 Shell “Warpify” 随后的子 Shell 会话。 在底层,此代码段会打印一个设备控制字符串 ([DCS](https://vt100.net/docs/vt510-rm/chapter4.html)) 供 Warp 读取,信号指示子 Shell 会话已启动并准备好进行 “Warpified”。随后,Warp 会在会话中执行设置脚本,启用全套 Warp 功能,如块 (blocks)、补全和输入编辑器。 出于这个原因,最好确保代码段被添加到 RC 文件的末尾,这样 Warp 就不会在 Shell 完成加载 RC 文件之前尝试执行设置脚本。 要禁用自动集成,请从相应的 RC 文件中删除该代码段。 如果您在加载 RC 文件的子 Shell 会话中遇到问题,[请提交 GitHub issue](https://github.com/warpdotdev/Warp/issues/new/choose)。 ## 后台命令 Warp 运行后台命令以支持各种实用功能,如补全、语法高亮和命令校正。例如,为了提供 git checkout 的补全,Warp 会运行一个后台命令来列出当前仓库中的所有 git 分支。 在本地子 Shell 会话中,这些命令在派生的 Shell 进程中运行,与您的交互式 Shell 会话隔离。这与任何非子 Shell 会话使用的实现方式相同。 然而,在远程会话中,Warp 采用了不同的方法 —— 虽然派生的 Shell 进程在本地机器上运行(即运行 Warp 应用程序的地方),但您的远程会话可能正在其他地方的服务器上运行。在这种情况下,Warp 利用会话的 “空闲时间”(即当前没有命令运行时),直接在会话本身中运行后台命令。这些命令在非交互式子 Shell 进程中执行,以防止修改会话状态(例如,它们不能修改环境变量)。 ### 显示/隐藏后台块 默认情况下,后台命令的块是隐藏的。要显示后台命令块,请在 macOS 菜单栏的 “Blocks” 菜单中选择 “Show background blocks”。 ### 在远程会话中禁用后台命令 我们理解一些开发者可能希望针对某些或所有环境禁用后台命令。 要在远程子 Shell 会话中禁用后台命令,您可以在顶层终端会话中执行以下命令: <Tabs> <TabItem label="macOS"> 更新位于 `dev.warp.Warp-Stable` 的默认设置,以包含以下名称-值对: `"DisableInBandCommands": "true"`。 ```bash defaults update dev.warp.Warp-Stable DisableInBandCommands true ``` </TabItem> <TabItem label="Windows"> 更新位于 `HKCU:\Software\Warp.dev\Warp` 的设置注册表,以包含以下名称-值对: `"DisableInBandCommands": "true"`。 ```powershell Set-ItemProperty -Path "HKCU:\SOFTWARE\Warp.dev\Warp" -Name DisableInBandCommands -Value true ``` </TabItem> <TabItem label="Linux"> 更新位于 `~/.config/warp-terminal/user_preferences.json` 的设置文件,以包含以下名称-值对: `"DisableInBandCommands": "true"`。 ```bash cd ~/.config/warp-terminal/ jq '.prefs += {"DisableInBandCommands": "true"}' user_preferences.json > tmp.json && mv tmp.json user_preferences.json ``` </TabItem> </Tabs> 这将有效禁用远程子 Shell 中的 Tab 补全、语法高亮、命令校正和 git 状态提示指示器。在 bash、zsh 和 fish 中 Warpify 子 Shell,在嵌套会话中获取 Warp 功能。
什么是子 Shell?
标题为 “什么是子 Shell?” 的章节在 Warp 的语境下,“子 Shell” 被定义为在现有运行中的 Shell 环境中产生并运行的任何嵌套交互式 Shell 会话。这可以是运行在本地机器上的嵌套会话、运行在 Docker 容器内的 Shell 会话,或者通过 SSH 访问的远程服务器。查看更多关于 SSH Warpification 的内容。
请注意,Warp 对子 Shell 的定义与常见的 Unix 子 Shell 定义有所不同,后者通常指作为交互式 Shell 的子进程产生的任何 Shell 进程。例如,在 bash 中,用括号括起来的命令是在具有自己的 PID 和可寻址内存空间的子 Shell 中执行的。
如何 Warpify 子 Shell
标题为 “如何 Warpify 子 Shell” 的章节默认情况下,Warp 自动将以下命令识别为 子 Shell 兼容
- bash, fish, zsh
- docker exec
- gcloud compute ssh
- eb ssh
- poetry shell
当您运行兼容子 Shell 的命令时,Warp 将通过提示邀请您 “Warpify” 该子 Shell,从而使 Warp 的所有现代 IDE 功能在该子 Shell 中可用。兼容子 Shell 的命令列表可以在下方所述的子 Shell 设置中进行配置。
配置兼容子 Shell 的命令
标题为 “配置子 Shell 兼容命令” 的章节要配置兼容子 Shell 的命令,请导航至 Settings > Warpify > Subshells。
添加兼容命令
标题为 “添加兼容命令” 的章节您可以将任何产生 bash、fish 或 zsh 子 Shell 的命令添加到 ‘Added commands’ 中,使其符合 “Warpification” 条件。
此外,您还可以向 “Added commands” 列表添加正则表达式。任何匹配已添加正则表达式的命令都将符合 “Warpification” 条件。
阻止名单命令
标题为 “阻止名单命令” 的章节某些类型的子 Shell 不兼容,您可能还希望控制 Warp 永远不要邀请您对特定命令的子 Shell 进行 “Warpify”。当您将命令添加到阻止名单时,Warp 将永远不会邀请您对由这些命令产生的子 Shell 进行 “Warpify”。
自动 “Warpify” 子 Shell
标题为 “自动 “Warpify” 子 Shell” 的章节要记住您对某个命令的偏好并跳过确认横幅,您可以手动将相应的代码段粘贴到子 Shell (bash、fish 或 zsh) 对应的 RC 文件末尾。
# For zsh subshells, add to ~/.zshrc.printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "zsh"}}\x9c'
# For bash subshells, add to ~/.bashrc or ~/.bash_profile.printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "bash"}}\x9c'
# For fish subshells, add to ~/.config/fish/config.fish.if status is-interactive printf '\eP$f{"hook": "SourcedRcFileForWarp", "value": { "shell": "fish"}}\x9c'end添加后,Warp 将在具有最新更新 RC 文件的机器上自动为相应的 Shell “Warpify” 随后的子 Shell 会话。
在底层,此代码段会打印一个设备控制字符串 (DCS) 供 Warp 读取,信号指示子 Shell 会话已启动并准备好进行 “Warpified”。随后,Warp 会在会话中执行设置脚本,启用全套 Warp 功能,如块 (blocks)、补全和输入编辑器。
出于这个原因,最好确保代码段被添加到 RC 文件的末尾,这样 Warp 就不会在 Shell 完成加载 RC 文件之前尝试执行设置脚本。
要禁用自动集成,请从相应的 RC 文件中删除该代码段。
如果您在加载 RC 文件的子 Shell 会话中遇到问题,请提交 GitHub issue。
后台命令
标题为 “后台命令” 的章节Warp 运行后台命令以支持各种实用功能,如补全、语法高亮和命令校正。例如,为了提供 git checkout 的补全,Warp 会运行一个后台命令来列出当前仓库中的所有 git 分支。
在本地子 Shell 会话中,这些命令在派生的 Shell 进程中运行,与您的交互式 Shell 会话隔离。这与任何非子 Shell 会话使用的实现方式相同。
然而,在远程会话中,Warp 采用了不同的方法 —— 虽然派生的 Shell 进程在本地机器上运行(即运行 Warp 应用程序的地方),但您的远程会话可能正在其他地方的服务器上运行。在这种情况下,Warp 利用会话的 “空闲时间” —— 即当前没有命令运行 —— 直接在会话本身中运行后台命令。这些命令在非交互式子 Shell 进程中执行,以防止修改会话状态(例如,它们不能修改环境变量)。
显示/隐藏后台块
标题为 “显示/隐藏后台块” 的章节默认情况下,后台命令的块是隐藏的。要显示后台命令块,请在 macOS 菜单栏的 “Blocks” 菜单中选择 “Show background blocks”。
在远程会话中禁用后台命令
标题为 “在远程会话中禁用后台命令” 的章节我们理解一些开发者可能希望针对某些或所有环境禁用后台命令。
要在远程子 Shell 会话中禁用后台命令,您可以在顶层终端会话中执行以下命令:
更新位于 dev.warp.Warp-Stable 的默认设置,以包含以下名称-值对:"DisableInBandCommands": "true"。
defaults update dev.warp.Warp-Stable DisableInBandCommands true更新位于 HKCU:\Software\Warp.dev\Warp 的设置注册表,以包含以下名称-值对:"DisableInBandCommands": "true"。
Set-ItemProperty -Path "HKCU:\SOFTWARE\Warp.dev\Warp" -Name DisableInBandCommands -Value true更新位于 ~/.config/warp-terminal/user_preferences.json 的设置文件,以包含以下名称-值对:"DisableInBandCommands": "true"。
cd ~/.config/warp-terminal/jq '.prefs += {"DisableInBandCommands": "true"}' user_preferences.json > tmp.json && mv tmp.json user_preferences.json这将有效禁用远程子 Shell 中的 Tab 补全、语法高亮、命令校正和 git 状态提示指示器。