如何在 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
键被设置为空字符串,这使得执行构建的命令认为密钥未设置并导致您看到的错误。
我正在尝试为远程计算机上的 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
键被设置为空字符串,这使得执行构建的命令认为密钥未设置并导致您看到的错误。