VSCode shell 任务转义单引号

VSCode shell task escaping single quotes

VSCode 在定义任务时提供 shell 转义。我尝试了不同的机制,但没有一个普遍适用的结果。

给定一个测试字符串:

hello 'world' (what's your name? --)

tasks.json 有:

    {
        "label": "test",
        "type": "shell",
        "command": "echo",
        "args":[
            {
                "value": ["${selectedText}"],
                "quoting": "escape"
            }

        ]
    },

通过这种方法,vscode 已将任务解析为:

echo hello\ \'world\'\ (what\'s\ your\ name?\ --)

这是完全错误的。 - 未转义,) 未转义,参数两边没有引号。

我试过引用="strong"

现在任务被解析为:

 echo 'hello 'world' (what's your name? --)'

那不行!现在字符串中的单引号挡住了。

我也试过将值更改为 ['${selectedText}'] - 在这种情况下,我们得到

echo ''

看来我们无法正确地 shell 开箱即用。我想我需要在 vscode 内部创建一个脚本并完全避免 shell。最好的方法是什么?

我在 Windows 10,WSL,bash,VSCode 1.55.1

我有一个解决方案,而且有效。希望其他人能感受到它带给我的快乐。 :-)

    {
        "label": "test",
        "type": "shell",
        "command": "echo \"$(cat << 'HEREDOC' \n${selectedText}\nHEREDOC\n)\" ",
    }

这利用了 bash 中存在的 HEREDOC 机制。 this thread 中的 skztr 归功于(有点晚了)- 2010 年发布!

这利用了 HEREDOC 语法 bash 支持:

<< 'TAG' 
stuff
TAG

允许将完全未处理的内容传递给 bash。请务必注意,<< 'TAG' 之后和最终 TAG 之前的换行符是必需的。为了使其在 json 文件中工作,我将 \n 放入字符串中,并且效果很好,因为它们将被传递给 shell,它将知道如何处理它们。

最后,“command”值周围的引号以及传递给 echo 的内容周围的引号是必需的。内部集合必须用“转义。因此我们得到

"command":  "echo \"...\""