Notepad++ NppExec: Перенаправление в файл с помощью «>» регистрирует его как аргумент и не работает, хотя работает в командной строке

Notepad++ NppExec: Перенаправление в файл с помощью «>» регистрирует его как аргумент и не работает, хотя работает в командной строке

Если взглянуть на код ниже, он просто преобразует файл 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".

Связанный контент