如何在节点脚本中将 CMD 命令链接到 WSL

How to chain CMD command to WSL in node-script

我有一个节点服务器,我想在启动它之前启动它所依赖的一切。 该包在 windows 上运行,但取决于 WSL 中的多容器 docker 设置。

所以我试过了


  "scripts": {
    "start": "wsl 'sudo service docker start && docker-compose up -d' && nodemon server.js --config nodemon.json",
  },

但它抛出

> Executing task: npm run start <

> wsl 'sudo service docker start && docker-compose up -d' && nodemon server.js --config nodemon.json

zsh:1: unmatched '
The terminal process "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command npm run start" terminated with exit code: 1.

执行此操作的正确语法是什么?

你确实有不匹配的引号,但我假设这只是尝试一系列不同编辑的产物;-)。

将脚本(多个命令)传递给 wsl 命令的最佳方法是将其传递给 sh(或 bash,如果需要)。现在只考虑 WSL 部分,那就是:

wsl -e sh -c "sudo service docker start && docker-compose up -d"

从您收到的错误消息来看,这似乎是通过 powershell.exe 解析的,我认为它不支持 && 链接。如果我没理解错的话,那只能在 PowerShell Core (pwsh.exe) 中使用。

所以完整的命令(希望如此):

wsl -e sh -c "sudo service docker start && docker-compose up -d"; nodemon server.js --config nodemon.json

引用应该不会太差,所以希望:

"scripts": {
    "start": "wsl -e sh -c 'sudo service docker start && docker-compose up -d'; nodemon server.js --config nodemon.json",
  },

当然没有直接测试,但如果它对你不起作用,请告诉我,我可以检查我可能出错的地方。

如果您确实需要基于先前成功的命令进行“链接”,那么也许可以考虑这样的事情:

wsl -e sh -c "sudo service docker start && docker-compose up -d && powershell.exe nodemon server.js --config nodemon.json"

... 这又很容易引用。但如果这不起作用(或者您最终需要多个在 PowerShell 中运行的命令),那么引用开始变得更加困难:

wsl -e sh -c "sudo service docker start && docker-compose up -d && powershell.exe -c \`"nodemon server.js --config nodemon.json\`""