【问题标题】:How to execute sub-shell commands in Sublime Text 3 build systems?如何在 Sublime Text 3 构建系统中执行子 shell 命令?
【发布时间】:2020-01-31 15:04:07
【问题描述】:

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

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

【问题讨论】:

    标签: shell sublimetext3 gnu-make sublime-build


    【解决方案1】:

    确实,您的问题是 $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 键设置为空字符串,这使得命令执行构建认为密钥未设置并导致您看到的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2015-03-01
      • 2013-10-14
      • 1970-01-01
      • 2014-01-17
      • 2014-10-30
      相关资源
      最近更新 更多