如何在 Sublime Text 3 构建系统中执行 sub-shell 命令?

How to execute sub-shell commands in Sublime Text 3 build systems?

我正在尝试为远程计算机上的 C++ 项目编写通用构建系统。远程主目录 ~/ 安装在我本地机器上的 /network/mountdir/,我的 file_path=/network/mountdir/project_dir/file.cc 对应于服务器上的 ~/project_dir/file.cc。我希望能够使用这个构建系统,而不管我在同一个远程服务器上的哪个目录。

为此,我尝试了以下方法。

"shell_cmd". : "ssh -tt server 'export TERM=xterm; cd' $(echo ${file_path} | cut -d'/' -f4-) '&& make'",
"shell"      : true,
"working_dir": "$file_path"

不幸的是,这不起作用。我收到以下错误。

shell_cmd or cmd is required
[cmd: None]

我认为这个投诉是由于 $(...) 子外壳引起的。我无法弄清楚如何进行这项工作。好心提醒。谢谢。

确实,您的问题是 $sublime-build 文件中是特殊的,因为它用于表示支持它的构建系统字段中的变量扩展,例如 ${file_path}您正在使用获取当前文件的路径。

在正常的操作过程中,如果您要在文本前面使用 $,Sublime 会将其视为要扩展的变量,并且任何具有它不理解的名称的变量都会被替换空字符串。

例如,像这样回显你的主目录的东西是行不通的:

"shell_cmd": "echo $HOME",

Sublime 将 $HOME 视为变量,它不知道那是什么,所以将其扩展为空字符串,结果是只执行不带参数的 echo 命令.

为了告诉 Sublime 命令中的 $ 是传递给 shell 的文字 $,您需要将其引用为 $;如果 Sublime 看到该序列,则它会将 $ 替换为 $ 并且不执行任何其他操作,从而让文本通过。

但是 sublime-build 文件是 JSON,并且在 JSON 中 $ 不是有效的转义序列,因此这样做会阻止文件解析为 JSON,这将导致您尝试构建并且状态栏将显示 No build system 因为无法加载文件。

所以,综合起来,这里的简单示例需要如下所示:

"shell_cmd": "echo \$HOME",

现在,当文件加载为 JSON 时,\ 被解析器转换为单个字符,让 Sublime 看到 $ 并按你想要的方式处理它.

有趣的是,在您的案例中,使用 $() 语法实际上触发了 Sublime 中可能存在的错误,因为它实际上导致整个 shell_cmd 键被设置为空字符串,这使得执行构建的命令认为密钥未设置并导致您看到的错误。