首页 > 解决方案 > 如何在 Sublime Text 3 构建系统中执行子 shell 命令?

问题描述

我正在尝试在远程机器上为我的 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]

我认为这个投诉是因为$(...)subshel​​l 而引发的。我无法弄清楚如何使这项工作。好心提醒。谢谢。

标签: shellsublimetext3gnu-makesublime-build

解决方案


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

在正常的操作过程中,如果你$在文本前面使用 a,Sublime 会将其视为一个变量来扩展,并且任何名称无法理解的变量都会被替换为空字符串。

因此,例如,像这样回显您的主目录的内容将不起作用:

"shell_cmd": "echo $HOME",

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

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

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

因此,综合来看,这里的简单示例需要如下所示:

"shell_cmd": "echo \\$HOME",

现在,当文件作为 JSON 加载时,\\解析器会将其转换为单个字符,让 Sublime 可以查看\$并按照您的需要处理它。

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


推荐阅读