Действительно, ваша проблема в том, что $
является особенным в sublime-build
файлах, потому что он используется для обозначения расширений переменных в полях системы сборки, которые его поддерживают, например, ${file_path}
, который вы используете для получения пути текущего файла.
В обычном ходе операций, если вы должны использовать $
перед текстом, Sublime обрабатывает его как переменную для расширения и любые переменные, имена которых у него нет. не понимаю, что заменяется пустой строкой.
Так, например, что-то вроде этого, чтобы отобразить ваш домашний каталог, не будет работать:
"shell_cmd": "echo $HOME",
Sublime видит $HOME
в качестве переменной, он не знает, что это такое, поэтому он расширяет ее до пустой строки, и в результате нужно просто выполнить команду echo
без аргументов.
Чтобы сообщить Sublime, что $
в ваша команда должна быть литералом $
, который передается в оболочку, вам нужно заключить ее в кавычки как \$
; если Sublime видит эту последовательность, то он заменяет \$
на $
и больше ничего не делает, что позволяет тексту проходить.
Однако sublime-build
файлы имеют значение JSON, а в JSON \$
не является допустимой escape-последовательностью, поэтому при этом файл не будет разбираться как JSON, что приведет к ситуации, при которой вы попытаетесь создать, и в строке состояния будет указано No build system
, поскольку файл не может быть загруженным.
Итак, вместе взятый простой пример должен выглядеть следующим образом:
"shell_cmd": "echo \\$HOME",
Теперь, когда файл загружен как JSON, \\
парсер преобразует их в один символ, оставляя Sublime видеть \$
и обрабатывать его так, как вы хотите.
В вашем случае интересно отметить, что использование синтаксиса $()
фактически вызывает то, что может быть ошибка в Sublime, потому что она фактически заставляет весь ключ shell_cmd
быть установлен в пустую строку, что заставляет команду, которая выполняет сборку, думать, что ключ не установлен, и вызывает ошибку, которую вы видя.