Ошибка ‘Недопустимый глагол’ только при вызове Inkscape в качестве подпроцесса

#node.js #subprocess #inkscape

#node.js #подпроцесс #чернильный пейзаж

Вопрос:

Когда я вызываю следующее в командной строке, это работает как шарм:

 inkscape --with-gui --batch-process --export-filename=- 
    --actions="select-all;ObjectToPath" 
    /full/path/to/example.svg
  

Но когда я открываю Node.js и выполните тот же вызов в подпроцессе следующим образом:

 const cp = require("child_process");
var child = cp.spawn(
    "/usr/bin/inkscape",
    [
        "--with-gui",
        "--batch-process",
        "--export-filename=-",
        '--actions="select-all;ObjectToPath"',
        "/full/path/to/example.svg",
    ],
    {
        cwd: process.cwd(),
        detached: true,
        stdio: "inherit",
    }
);
  

Я получаю следующую ошибку:

 Unable to find: "select-all
verbs_action: Invalid verb: "select-all
Unable to find: ObjectToPath"
verbs_action: Invalid verb: ObjectToPath"
  

и файл возвращается (печатается в стандартный вывод) без изменений. Есть идеи, почему глаголы не найдены при запуске Inkscape в качестве подпроцесса, но не вызывается непосредственно из терминала? Я получаю эту же ошибку в ubuntu (20.04) и OSX, используя последнюю версию Inkscape (1.0.1 r73).

Ответ №1:

Когда вы используете cp.spawn с массивом аргументов, вам не нужно заключать их во внутренние кавычки "select-all;ObjectToPath" , как это было бы с оболочкой. (В оболочке кавычки не позволяют оболочке разделять командную строку на две строки. Из-за того же механизма — или его отсутствия — попытка использовать переменные оболочки, такие как $$ или переменные среды, такие как $PATH , завершится неудачей при использовании cp.spawn , так как нет ничего, что можно было бы проанализировать.)

Я бы предположил

 const cp = require("child_process");
var child = cp.spawn(
  "/usr/bin/inkscape",
  [
    "--with-gui",
    "--batch-process",
    "--export-filename=-",
    "--actions=select-all;ObjectToPath",
    "/full/path/to/example.svg",
  ],
  {
    cwd: process.cwd(),
    detached: true,
    stdio: "inherit",
  },
);
  

помогло бы вам.

Комментарии:

1. Потрясающе! Сработало как шарм 🙂