В чем разница между процессом и оболочкой в ​​vscode tasks.json

В разделе " Пользовательские задачи" в разделе " Задачи в коде Visual Studio" описаны свойства задачи. E сть type свойство, определяющее тип задачи:

Тип: тип задачи. Для пользовательской задачи это может быть shell или же process, Если shell Если команда указана, команда интерпретируется как команда оболочки (например, bash, cmd или PowerShell). Если process указано, команда интерпретируется как процесс для выполнения.

Я не мог понять, в чем разница между ними. Неважно, я выбираю shell или же process все результаты выполнения одинаковы.

Так в чем же разница между интерпретацией как команды оболочки и командой, интерпретируемой как процесс, который на самом деле означает выполнение?

3 ответа

Решение

Команды оболочки могут выполняться только внутри оболочки, такой как DIR за cmd а также if за bash, Поэтому, когда вы хотите запустить команды оболочки, вы должны использовать "type": "shell" Настройка для правильного запуска. Когда вы хотите просто запустить программу, такую ​​как .bat, .sh или же .exeтогда вы можете просто использовать "type": "process" установка.

Ну , недавно у меня возникла проблема, и я, наконец, решил ее, изменив тип с "процесс" на "оболочку", и я думаю, что это может вам помочь: я пытаюсь запустить более одного файла.cpp, и я использовал подстановочный знак в аргументах: "$ {fileDirname} /.cpp". Когда тип был обработанным, я не могу успешно запустить проект, поскольку он всегда говорит мне: "*.cpp": нет такого файла или каталога, и когда я перехожу на "оболочку", все идет хорошо. Это может быть одно из различий между "процессом" и "оболочкой".

Я думаю разница в следующем:

  • : запускает определенную программу (двоичный файл)
  • : запускает сеанс оболочки и запускает данную команду внутри этого сеанса оболочки

Если команда, которую вы даете оболочке, это просто (путь) к программе, напримерdate, результат будет точно таким же.

      {
  "version": "2.0.0",
  "tasks": [
    {
      "label": "example1",
      "type": "process",
      "command": "date",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    },
    {
      "label": "example2",
      "type": "shell",
      "command": "date",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    }
  ]
}

Задача, которая использует, вероятно, будет немного быстрее, потому что она не запускает сеанс оболочки.

Но поскольку задача типа создает сеанс оболочки, она может использовать любую команду, которую вы можете ввести в командной строке. Итак, допустим, задача, которую мы хотим запустить,date -u +"%Y-%m-%dT%H:%M:%SZ", мы можем сделать это с задачей, но не сprocessзадача.

Пример:

      {
  "version": "2.0.0",
  "tasks": [
    {
      "label": "example1",
      "type": "process",
      "command": "date",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    },
    {
      "label": "example2",
      "type": "shell",
      "command": "date -u +\"%Y-%m-%dT%H:%M:%SZ\"",
      "presentation": {
        "reveal": "always"
      },
      "problemMatcher": []
    }
  ]
}

Так что, как всегда, это зависит от того, что вам нужно или хотите. Лично я считаю задачи типаshellполезны гораздо чаще.


Еще одно: определение задачи также может иметь"args"key, куда вы можете отправлять аргументы. Это может позволить вам отправлять аргументы, если вам нужно использовать process. Я не исследовал это, чтобы ответить на этот вопрос.

Еще одна релевантная страница документации.

Другие вопросы по тегам