节点 - 检查路径中是否存在命令

Node - check existence of command in path

我有一个独特的问题,我需要使用 Node 迭代几个 Unix 风格的命令,看看它们是否存在于 Windows 安装的 path 中。

例如,Windows 本身不支持 ls。但是,假设有人安装了 git 并检查了是否包含 Unix 命令,它会。

我想知道ls和其他命令是否在系统path中。

现在,我在每个命令上使用 child_process 到 运行 help。然后我检查 运行ning 它的响应。这是混乱和危险的。我不想 运行 来自 Node 的 30 个任意命令:

var spawnSync = require('child_process').spawnSync;
var out = spawnSync('ls', ['/?'], {encoding: 'utf8'});

我还能如何检查这些命令是否存在?

你能不能不检查一下你的Path目录,看看ls命令文件是否存在。

如果文件不在目录中,那么它不在路径中。

您可以在 Linux 中使用 whereis,在 Windows 中使用 where 来查看是否可以找到可执行文件

var isWin = require('os').platform().indexOf('win') > -1;

var where = isWin ? 'where' : 'whereis';

var spawn = require('child_process').spawn;

var out = spawn(where + ' ls', ['/?'], {encoding: 'utf8'});

out.on('close', function (code) {
    console.log('exit code : ' + code);
});

我个人发现 npm 上的 command-exists module 效果很好。

安装

npm install command-exists

用法

  • 异步

    var commandExists = require('command-exists');
    
    commandExists('ls', function(err, commandExists) {
    
        if(commandExists) {
            // proceed confidently knowing this command is available
        }
    
    });
    
  • 承诺

    var commandExists = require('command-exists');
    
    // invoked without a callback, it returns a promise
    commandExists('ls')
    .then(function(command){
        // proceed
    }).catch(function(){
        // command doesn't exist
    });
    
  • 同步

    var commandExistsSync = require('command-exists').sync;
    // returns true/false; doesn't throw
    if (commandExistsSync('ls')) {
        // proceed
    } else {
        // ...
    }
    

不要 使用 child_process ,内部使用 child_process 的包都不会。 ,最直接的方法就是检查你的路径。

这是一个 NPM lookpath 包,它会扫描您的 $PATH$Path

const { lookpath } = require('lookpath');

const p = await lookpath('bash');
// "/bin/bash"

这是来自 Go 的 exec.LookPath 的 Node.js 端口。

希望对您有所帮助

这里提供了针对不同shell的解决方案:

https://mywiki.wooledge.org/BashFAQ/081

例如对于 bash:

# Bash
if hash qwerty 2>/dev/null; then
  echo qwerty exists
else
  echo qwerty does not exist
fi

2021-10-13

我查看了这些 Node 包并按偏好列出,原因如下:

  1. https://www.npmjs.com/package/which - 占地面积小,具有一个依赖项,可查看路径并且 OS 不可知。
  2. https://www.npmjs.com/package/npm-which - adds NPM path to which’s 查找。
  3. https://www.npmjs.com/package/lookpath - similar to which 但必须明确说明扩展名。
  4. https://www.npmjs.com/package/command-exists - 如果 fs.access return 无效,则使用子进程。