【问题标题】:Node - check existence of command in path节点 - 检查路径中是否存在命令
【发布时间】:2016-04-29 10:26:05
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 实际上有middleware 吗?
  • 那是草率、懒惰的中间件。它只是做一个var child = exec('which ' + commandName);。 Windows 上不存在命令 which。我已经在寻找一个跨平台的 shell 命令来确定进程是否存在,但我找不到。
  • 不确定是否有什么神奇的东西适用于所有事情,如果你知道你是否在使用 dos 或 bash 等,你可能会更好。
  • 仅供参考,Windows 和 Linux 都有 where,具有相同的参数
  • 糟糕,Windows 有where,Ubuntu 有whereis,同样的东西,不同的名称。再一次,没有任何东西在任何地方都有效

标签: node.js path command


【解决方案1】:

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

如果文件在目录中不存在,则它不在路径中。

【讨论】:

  • 我想我可以遍历所有路径,但这似乎有点低效。希望有更好的解决方案,但我会记住这一点。
  • @dthree 与生成子进程相比,遍历 PATH 更有效。我实现了一个 NPM 来做到这一点npmjs.com/package/lookpath 有关更多信息,请参阅stackoverflow.com/a/56321089/1368868。谢谢。
【解决方案2】:

您可以在 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);
});

【讨论】:

  • whereis 在 Mac OS 上似乎没有在 /usr/local/bin 中找到命令(在我的 PATH 环境变量中)。但是which 可以。
  • 编辑答案以包括 Mac OS。
  • 我在 macos 上收到错误 Error: spawn where ls ENOENT。
  • @loretoparisi - ENOENT 表示没有这样的文件或目录,正如上面评论中所说,whereis 在 MacOS 上找不到命令,您需要包含 which不知何故
【解决方案3】:

我个人发现 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 {
        // ...
    }
    

【讨论】:

  • 对于 Windows 命令,是否需要添加.exe 后缀?像这样:commandExists('curl.exe', function(err, commandExists) {...} ?
【解决方案4】:

不要为此使用 child_process,内部使用 child_process 的软件包也不行。 As Matt already answered,最直接的方法就是检查你的路径。

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

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

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

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

希望对你有帮助

【讨论】:

    【解决方案5】:

    这里提供了不同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
    

    【讨论】:

    【解决方案6】:

    2021-10-13

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

    1. https://www.npmjs.com/package/which - 占用空间小,只有一个依赖项,它通过路径查找并且与操作系统无关。
    2. https://www.npmjs.com/package/npm-which - 将 NPM 路径添加到 which’s 查找。
    3. https://www.npmjs.com/package/lookpath - 类似于 which,但必须明确说明扩展名。
    4. https://www.npmjs.com/package/command-exists - 如果 fs.access 返回无效,则使用子进程。

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2017-06-03
      • 1970-01-01
      • 2019-04-03
      • 2019-02-10
      • 1970-01-01
      相关资源
      最近更新 更多