VS Code: выполнение задач с WSL / Bash - PullRequest
0 голосов
/ 24 мая 2018

WSL позволяет легко получить gcc и другие инструменты Linux.Вы можете использовать скрипт для быстрой настройки среды разработки WSL, поэтому, если вы что-то напутаете, вы можете быстро уничтожить это и начать все заново с минимальными затратами.Поэтому я хотел бы запускать задачи на WSL, а не на самой Windows.

Например, в Sublime3 я могу собрать код C, используя WSL-установку GCC, просто создав новую систему сборки со следующим кодом:

{
  "cmd" : ["bash", "-c", "gcc ${file_name} -o ${file_base_name} && ./${file_base_name}"],
  "shell": true,
  "working_dir": "${file_path}",
}

Я пытался выяснить,как повторить это на VS Code безуспешно.Кажется, что как минимум еще одному человеку удалось заставить это работать , поэтому это должно быть возможно.

Кажется, что правильным способом является настройка файла tasks.json.Соответствующие строки выглядят так:

"command": "bash.exe",
    "args": ["-c", "'insert code here'"]

Похоже, что это говорит PowerShell для запуска bash -c 'insert code here'.Может кто-нибудь придумать правильную команду?


Немного предыстории:

${file} - это переменная, представляющая активный файл в VSCode.Вот список всех предопределенных переменных .

wslpath - это новая команда bash, поставляемая в Windows 1803, которая принимает путь Windows и возвращает путь wsl, например:

$ wslpath "c:\Users\Evan\Google Drive\Development\Programming Languages\file.c"
/mnt/c/Users/Evan/Google Drive/Development/Programming Languages/file.c

Мои попытки:

Я пытался написать скрипт для этого, но столкнулся с проблемами.Синтаксис tasks.json для вызова myscript должен выглядеть примерно так (обратите внимание, что мы передаем имя файла скрипту, чтобы скрипт мог передать его в GCC).

"args": ["-c", "'myscript.sh \"${file}\"'"]

или согласно этому ответ

"command": "/path/to/script.sh"
"args": ["\"${file}\""]

myscript может выглядеть примерно так:

#!/bin/bash
echo "File Path is here $1"
x=$(wslpath "$1")
gcc "$x" -o a.out
./a.out

VS Code Docs

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Это можно сделать без использования скрипта:

 "command": "gcc '$(wslpath '${file}')' && ./a.out"

${file} будет проанализирован перед анализом команды в bash.

0 голосов
/ 19 июня 2019

Чтобы избежать изменения оболочки по умолчанию, чтобы она работала в Powershell, и избегать длинных escape-последовательностей, лучше использовать отдельный файл.

Средство запуска:

{
            "label": "command name",
            "type": "shell",
            "command": ".\\command_name.bat",
            "problemMatcher": []
}

Пакетный файл:

bash.exe -c "ssh -T bastion \"for proxy in bunch of different hosts ; do echo \\\$proxy ; ssh \\\$proxy -T -oBatchMode=yes -oStrictHostKeyChecking=no -oConnectTimeout=3 \\\"command --with --parameters\\\" ; done\""
0 голосов
/ 25 мая 2018

Я понял это.Во-первых, убедитесь, что ваши пользовательские настройки настроены на использование bash:

"terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\bash.exe"

Примечание "C:\\Windows\\System32\\bash.exe" также, кажется, работает нормально.


Далее ваш файл tasks.json должен содержать следующие строки:

"type": "shell",                                        //Uses the default shee (make sure this is set to bash)
"command": "'./path to/your/script.sh'",                //Unix Style Path to the Script (remember, bash is your shell reading this).
"args": ["\"${file}\""],                                //Pass the path to the source code as an arg 
"useWSL": true,                                         //This was suggested somewhere. The script runs fine without it though.... Not sure what this does. 

Наконец, вот скрипт. Обязательно измените окончания строк на LF.Сценарий не работает иначе.

#!/bin/bash
echo "Running Script"
echo "Windows File Path $1"           #The Windows file path we passed in as an argument
wslpath=$(wslpath "$1")               #Convert the Windows path to a Unix Style Path
echo "wslpath is $wslpath"
gcc "$wslpath"                        #Compile the file
echo "done" 
./a.out                               #execute the compiled file

Затем, открыв любой файл C и нажав Ctrl + Shift + B и выбрав имя скрипта в меню задачи сборки, вы сможете скомпилировать файл C в a.out в текущем каталоге.

...