Как выполнять команды под-оболочки в системах сборки Sublime Text 3? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь написать обобщенную c систему сборки для моих проектов C ++ на удаленной машине. Удаленный домашний каталог ~/ смонтирован на моем локальном компьютере в /network/mountdir/, а мой file_path=/network/mountdir/project_dir/file.cc соответствует ~/project_dir/file.cc на сервере. Я sh смогу использовать эту систему сборки независимо от того, в каком каталоге я нахожусь на том же удаленном сервере.

Для этой цели я пробую что-то вроде следующего:

"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]

Я полагаю, что эта жалоба была выдана из-за подоболочки $(...). Я не могу понять, как заставить это работать. Добрый совет. Спасибо.

1 Ответ

1 голос
/ 31 января 2020

Действительно, ваша проблема в том, что $ является особенным в 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 быть установлен в пустую строку, что заставляет команду, которая выполняет сборку, думать, что ключ не установлен, и вызывает ошибку, которую вы видя.

...