【发布时间】: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