【问题标题】:VSCode shell task escaping single quotesVSCode shell 任务转义单引号
【发布时间】:2021-04-20 01:01:02
【问题描述】:

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?\ --)

这是完全错误的。 - 未转义,) 未转义,并且参数周围没有引号。

我试过 quoting="strong"

现在任务被解析为:

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

这样不好!现在字符串中的单引号挡住了。

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

echo ''

我们似乎无法在开箱即用的情况下获得正确的外壳转义。我想我需要在 vscode 内部创建一个脚本并完全避免使用 shell。最好的方法是什么?

我使用的是 Windows 10、WSL、bash、VSCode 1.55.1

【问题讨论】:

  • 我不确定我是否理解所述原始行为有什么问题。 echo hello\ \'world\'\ (what\'s\ your\ name?\ --)不是完全错误的。它与$'hello \'world\' (what's your name? --)' 完全相同的字符串,当通过eval 阶段解析时,这意味着post-shell-eval,它变成了作为JSON 描述为"hello 'world' (what's your name? --)" 的字符串。
  • ...如果真正的问题是您告诉 VS Code 为 eval 转义,但实际上并没有 eval 发生,会有道理。但是,我不使用 VS Code(仍然对微软在 2000 年代中期资助 SCO 的反 Linux 工作感到不满,并且不愿意使用他们制作的任何东西),所以不能直接复制。
  • 我希望将 SQL 查询通过管道传输到终端上的 psql。所以我需要确保屏幕上的内容准确地到达外壳。第一个选项会在 -- 和 ) 上生成 bash 错误
  • 你是对的 - () 应该被转义。 (我不明白为什么需要--)。
  • 以破折号开始的字符串有时会进行特殊处理(pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 中记录的 POSIX 指定规则是相关的),但这通常是 bash 本身的下游,可以在实用程序中找到它运行。无论如何,是的,我完全同意; vscode 转义应该是固定的。在你的鞋子里,我可能会尝试找到一个根本不需要任何 shell 转义的解决方案(而是将文字参数向量传递给目标进程),但这适用于实际运行 VSCode 并且可以测试其他方法来尝试修复的人.

标签: bash shell visual-studio-code vscode-tasks


【解决方案1】:

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

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

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

这利用了 bash 支持的 HEREDOC 语法:

<< 'TAG' 
stuff
TAG

允许将内容完全未经处理地传递给 bash。请务必注意,

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

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

【讨论】:

  • 仅当您的selectedText 不包含仅包含HEREDOC 的行时才有效。这是一个很大的限制。
  • 我想,使用像 uuid 这样更长的随机生成的字符串会有所改进。
猜你喜欢
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多