VS代码:使用WSL / Bash运行任务

时间:2018-05-24 16:09:09

标签: bash visual-studio-code windows-subsystem-for-linux

WSL可以轻松获取gcc和其他Linux工具。您可以使用脚本快速配置WSL开发环境,因此如果您搞砸了某些内容,您可以快速销毁它并以最低成本重新开始。因此,我想在WSL上运行任务,而不是在Windows本身上运行。

例如,在Sublime3中,我可以使用GCC的WSL安装来构建C代码,只需使用以下代码创建一个新的构建系统:

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

到目前为止,我一直在试图弄清楚如何在VS Code上复制它。似乎至少有一个人设法得到这个working所以它应该是可能的。

似乎正确的方法是配置tasks.json文件。相关的线条似乎是:

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

这似乎告诉powershell运行bash -c 'insert code here'。任何人都可以提出正确的命令吗?

一些背景知识:

${file}是一个表示VSCode中活动文件的变量。以下是所有predefined variables的列表。

wslpath是在Windows 1803中发布的一个新的bash命令,它采用Windows路径并返回wsl路径,例如:

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

我的尝试:

我尝试编写脚本来执行此操作,但遇到了问题。调用myscript的tasks.json语法应该是这样的(注意我们将文件名传递给脚本,以便脚本可以将它传递给GCC)。

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

或根据此answer

"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

5 个答案:

答案 0 :(得分:1)

可以在没有脚本的情况下完成:

 "command": "gcc '$(wslpath '${file}')' && ./a.out"
在bash中解析命令之前,将解析

${file}

答案 1 :(得分:0)

我明白了。首先,确保您的用户设置已配置为使用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。

答案 2 :(得分:0)

为避免更改默认Shell,请使其在Powershell中运行,并避免较长的转义序列,最好使用单独的文件。

发射器:

{
            "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\""

答案 3 :(得分:0)

这是另一个快速解决方案,该解决方案是如何使用vscode中bash文件中的task.json命令解决问题的方法。您几乎可以接受并插入所需的命令。如果需要,还可以链接和嵌套命令。

{
    "version": "2.0.0",
    "tasks": [
        {
            // link current file. Uses one or more object.o files
            "label": "link_only_cpp_17",
            "type": "shell",
            "command": "bash", // call bash
            "args": [
                "-c", // read commands from string
                "\"g++ -g -o a $(ls | grep -F .o | tr '\\n' ' ')\"" // link all files ending with .o
            ],
            "problemMatcher": []
        }
    ]
}

这是我的task.json文件中的一个示例。它显示您可以使用bash命令并将任意代码传递给它。为此,您必须使用-c标志(从字符串中读取代码),然后将代码作为字符串(下一个参数)传递。在此示例中,g++链接包含.o的所有文件。这些文件是在$(ls | grep -F .o | tr '\\n' ' ')的帮助下找到的。请注意,您必须使用$(),否则,您的代码将不会被评估。

据我所知,您不能在传递给bash的命令中使用vscode宏(例如${file}),因为这是字符串文字。这就是为什么我使用a而不是文件名的原因。如果您知道执行此操作的方法,请告诉我:)

在vscode版本1.38.1上工作。

答案 4 :(得分:0)

一个简单的解决方法:在命令前加上 wsl screenshot