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
答案 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)