首页 > 解决方案 > (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

我去过以下页面寻求帮助:

调试命令中未转义单引号 #91578

我如何使用 bash-on-ubuntu-on-windows-wsl-for-my-vs-code-terminal

回归:包含空格的 WSL Shell 任务命令失败

在运行构建命令之前,构建配置中的路径分隔符被转义/剥离 #35593

从 powershell 中 tasks.json 的命令中删除的所有双引号 #72039

变量引用

当然还有:通过任务与外部工具集成

我看到其他人正在为此苦苦挣扎。我不知道那是不是最新的。当有人最终得到它或者问题从我不知道的其他一些功能上消失时,这些东西会找到一条死胡同。

我确信答案就在这些链接的某个地方。我只是找不到适合我的。我尝试了各种转义字符的变体,但没有一个对我有用。

您还会看到,与知道自己在做什么的人会使用的相比,最后的论点是淫秽的。相同的命令在“命令”中起作用:,但不是作为 arg。

我尽量避免问问题,但这让我很生气。我非常接近能够使用任务来做更多事情,但我发现文档不完整并且没有 shell 看到的示例。

您可能会看到我要完成的工作。您能否就如何尽可能轻松地做到这一点提供任何建议?

标签: visual-studio-codeescapingwindows-subsystem-for-linuxvscode-tasks

解决方案


从您链接到的“包含空格失败”问题中,我无法使示例“我的任务”的原始版本正常工作,因此看起来固定回归似乎再次回归。要么这样,要么新的 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 系统上运行。


推荐阅读