vscode 在Linux上,进程任务可以尝试执行目录,

efzxgjgh  于 6个月前  发布在  Vscode
关注(0)|答案(2)|浏览(45)

这个问题在所有扩展被禁用时是否发生?:是的

  • VS Code 版本:1.70.2
  • OS 版本:Linux x64 5.19.2-1-MANJARO

重现步骤:

  1. 使用 "process" 任务安装一个扩展,该任务运行来自 PATH 的可执行文件,例如 this minimal extension 运行 python
  2. 在第一个 PATH 条目中创建一个与可执行文件同名的文件夹,例如 ~/.local/bin/python
  3. 尝试执行任务,收到以下错误:
*  Executing task: python

execvp(3) failed.: Permission denied

 *  The terminal process "python" failed to launch (exit code: 1). 
 *  Terminal will be reused by tasks, press any key to close it.

这是因为 findExecutable 函数默认使用的函数不检查某物是文件还是目录,而只检查它是否存在:
vscode/src/vs/platform/terminal/node/terminalEnvironment.ts
第27行 in 68cda09
| | exportasyncfunctionfindExecutable(command: string,cwd?: string,paths?: string[],env: IProcessEnvironment=process.envasIProcessEnvironment,exists: (path: string)=>Promise=pfs.Promises.exists): Promise<string|undefined>{ |
这个问题在 win32.findExecutable 中已经修复,其中在搜索 PATH 时忽略目录。然而,由于这些函数位于不同的文件中,另一个函数错过了这个修复。
理想情况下,这两个函数应该合并,因为它们执行的任务基本相同,这样可以避免将来出现这个问题。也许值得考虑在平台之间保持任务行为一致性,以便在哪个点解析可执行路径方面达成一致,这似乎是我们一开始出现两个实现的原因。

epfja78i

epfja78i2#

#158666 与此问题有一定关联,但这两个问题分别来自代码的不同部分。这个问题来自于 findExecutable 函数。

这个 PR 会稍稍改善这种情况,因为这个错误会被提前捕获到,所以它会显示为:The terminal process failed to launch: Path to shell executable "python" is not a file or a symlink.。然而,预期的行为是,如果存在一个有效的可执行文件,那么无论 PATH 中有任何目录,都不应该出现错误。

相关问题