visual-studio-code - (tasks.json)我不知道如何使用 WSL 作为 shell 来使用转义字符
问题描述
我在 Windows10 上运行 VSCode 1.54.3 以及 WSL 中的 Ubuntu。
这是我正在尝试构建的任务。
{
"label": "Verilog: Compile iVerilog File ",
"command": "iverilog",
"type": "shell",
"args": [
"-t vvp",
"-o ${fileBasename}.vvp",
"-l /opt/Xilinx/14.7/ISE_DS/ISE/DCM_SP.v",
"-I /opt/Xilinx/14.7/ISE_DS/ISE/verilog/src/unisims",
"-I /opt/Xilinx/14.7/ISE_DS/ISE/verilog/src/XilinxCoreLib/",
"wslpath ${workspaceFolder}${pathSeparator}${relativeFileDirname}${pathSeparator}${fileBasenameNoExtension}.v"
],
"problemMatcher": [
"$tsc"
],
"presentation": {
"reveal": "always"
},
"group": "build"
}
显然我在这里是因为它不起作用,所以我来这里是为了让自己站在更聪明的人的脚下。
这是它实际运行的
> Executing task in folder xilinx_projects: iverilog '-t vvp' '-o pulse2.v.vvp' '-l /opt/Xilinx/14.7/ISE_DS/ISE/DCM_SP.v' '-I /opt/Xilinx/14.7/ISE_DS/ISE/verilog/src/unisims' '-I /opt/Xilinx/14.7/ISE_DS/ISE/verilog/src/XilinxCoreLib/' 'wslpath C:\demand\xilinx_projects\pulse2\pulse2.v
我去过以下页面寻求帮助:
我如何使用 bash-on-ubuntu-on-windows-wsl-for-my-vs-code-terminal
在运行构建命令之前,构建配置中的路径分隔符被转义/剥离 #35593
从 powershell 中 tasks.json 的命令中删除的所有双引号 #72039
我看到其他人正在为此苦苦挣扎。我不知道那是不是最新的。当有人最终得到它或者问题从我不知道的其他一些功能上消失时,这些东西会找到一条死胡同。
我确信答案就在这些链接的某个地方。我只是找不到适合我的。我尝试了各种转义字符的变体,但没有一个对我有用。
您还会看到,与知道自己在做什么的人会使用的相比,最后的论点是淫秽的。相同的命令在“命令”中起作用:,但不是作为 arg。
我尽量避免问问题,但这让我很生气。我非常接近能够使用任务来做更多事情,但我发现文档不完整并且没有 shell 看到的示例。
您可能会看到我要完成的工作。您能否就如何尽可能轻松地做到这一点提供任何建议?
解决方案
从您链接到的“包含空格失败”问题中,我无法使示例“我的任务”的原始版本正常工作,因此看起来固定回归似乎再次回归。要么这样,要么新的 2.0.0 任务系统不会以同样的方式解析它。
该示例使用了一个 long "command"
,但指定了"executable"
as wsl.exe
。此处可能发生了其他变化,因为${env:windir}
从 WSL 启动 vscode 时,阅读此处指定的内容对我也不起作用。但没关系,我现在只是要离开这条路。
那里提出的一种替代方法是将每个元素指定为单独的 arg(即"args": [ "ls", "/", "&&", "echo", "OK", "#", "comment" ]
)。这对我有用,而且你的iverilog
论点在以这种方式解析时似乎也有效。至少,它作为一个不带引号的命令行出现。老实说,Tasks 文档的“引用”部分的阅读方式听起来像是预期的方式——让每个元素都是一个单独的“arg”。从该页面:
如果提供了命令和参数,如果命令或参数包含空格,任务系统将使用单引号。
当然,这正是我们所看到的。
但我也发现了另一种选择。该线程后面的评论提到传递-c
给(旧)ubuntu1804.exe
可执行文件。这导致我为该wsl.exe
命令尝试了类似的东西,它可以传递“-e”、“sh”和“-c”的参数以及 中的完整命令行"command"
,如下所示:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Verilog: Compile iVerilog File",
"options": {
"shell": {
"executable": "wsl.exe",
"args": [
"-e"
"sh",
"-c"
]
}
},
"type": "shell",
"command": "iverilog -t vvp -o ${fileBasename}.vvp -l /opt/Xilinx/14.7/ISE_DS/ISE/DCM_SP.v -I /opt/Xilinx/14.7/ISE_DS/ISE/verilog/src/unisims -I /opt/Xilinx/14.7/ISE_DS/ISE/verilog/src/XilinxCoreLib/ wslpath ${workspaceFolder}${pathSeparator}${relativeFileDirname}${pathSeparator}${fileBasenameNoExtension}.v",
"problemMatcher": [
"$tsc"
],
"presentation": {
"reveal": "always"
},
"group": "build"
},
{
"label": "My Task",
"options": {
"shell": {
"executable": "wsl.exe",
"args": [
"-e",
"sh",
"-c"
]
}
},
"type": "shell",
"command": "ls / && echo OK # comment",
"problemMatcher": [],
"presentation": {
"reveal": "always"
},
"group": "build"
}
]
}
我相信那是您为iverilog
. 我还包含了“我的任务”示例,它足够通用,可以在任何 WSL 系统上运行。
推荐阅读
- php - Laravel 通知 MailMessage 主题不起作用
- html - 如何调整引导程序 4 中的下拉位置?
- java - 如何获取对象 objPlayer 的值?
- html - 我怎样才能让所有东西都集中在每台设备上?
- python - 使用 Unix 开始逐行拆分文件
- javascript - Promise.all 无法与 mongoose 结合使用/等待 JavaScript
- ios - inputAccessoryView 没有在 iPhone X 上获得触摸事件
- reactjs - 哪个 Visual Studio Code 扩展会自动创建“style.js”文件?
- python - 打印非整数作为输出
- node.js - 尝试交换身份验证代码以获取凭据时的未授权客户端