
Если взглянуть на код ниже, он просто преобразует файл ac или c++, например, main.cpp
в его состояние после предварительной обработки, например main_pp.cpp
, .
Однако запуск сгенерированной им команды g++ -E "main.cpp" > "main_pp.cpp"
в командной строке работает нормально.
Точная ошибка — g++: error: >: Invalid argument
, поэтому, по-видимому, он не видит, что >
не является частью списка аргументов.
cd "$(CURRENT_DIRECTORY)"
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
Кто-нибудь знает, почему поведение NppExec отличается от поведения стандартной командной строки?
решение1
Перенаправление вывода через >
и конвейеризация через |
— это то, за что отвечает интерпретатор командной строки. В Windows cmd.exe
— это интерпретатор командной строки. Поэтому вместо
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
использовать это:
cmd /C g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
решение2
Короткий ответ заключается в том, что интерпретатор командной строки делает гораздо больше, чем просто выполняет другие программы, и такие вещи, как перенаправление вывода программы с помощью >
или передача вывода по конвейеру, |
являются функциями, предоставляемыми интерпретатором командной строки, поэтому NppExec должен будет имитировать это, чтобы работать.
Более точный ответ: обычно вы запускаете новые процессы в Windows с помощьюCreateProcess()
и связанные функции, и хотя вы можете перенаправить вывод нового процесса, это не так просто, как использование >
. Вам нужнооткрыть ручкув файл и передайте его вSTARTUPINFOA
используя соответствующие флаги.
Таким образом, для поддержки >
перенаправления NppExec необходимо будет проанализировать строку, чтобы отделить эту часть от приложения и параметров, что может оказаться сложной задачей, а также необходимо будет учесть, что можно перенаправить данные и на другие объекты, не являющиеся файлами, например на принтер.
Это не невозможно, и похоже, что NppExec делает некоторый базовый разбор, потому что в вашем примере вы используете , cd
который также предоставляется интерпретатором командной строки. Но это может быть так же просто, как просто проверить, являются ли первые два не пробельных символа строки "cd", а затем использовать оставшуюся часть строки для изменениятекущий каталог.
Я также подозреваю, что NppExec даже не разбирает строку, чтобы отделить приложение от параметров. Я думаю, что он просто заменяет переменные и пользуется тем фактом, что CreateProcess()
позволяет опустить параметр приложения, поэтому он может просто передать всю строку как параметр командной строки (по крайней мере, я бы так сделал :-).
Наконец, программы, которые просто выводят свой результат на стандартный вывод, ожидая, что вы перенаправите его в файл или передадите его другой программе, более типичны для Unix/Linux (g++, похоже, является частью GNU, изначально созданной для Unix). В Windows более распространено использование параметра для указания выходного файла, поэтому поддержка перенаправления не является чем-то, что вы могли бы считать главным приоритетом (или даже вообще не думать об этом), если вы не используете программы "в стиле Linux".