节点 - 检查路径中是否存在命令
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 包并按偏好列出,原因如下:
- https://www.npmjs.com/package/which - 占地面积小,具有一个依赖项,可查看路径并且 OS 不可知。
- https://www.npmjs.com/package/npm-which - adds NPM path to which’s 查找。
- https://www.npmjs.com/package/lookpath - similar to which 但必须明确说明扩展名。
- https://www.npmjs.com/package/command-exists - 如果 fs.access return 无效,则使用子进程。
我有一个独特的问题,我需要使用 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 包并按偏好列出,原因如下:
- https://www.npmjs.com/package/which - 占地面积小,具有一个依赖项,可查看路径并且 OS 不可知。
- https://www.npmjs.com/package/npm-which - adds NPM path to which’s 查找。
- https://www.npmjs.com/package/lookpath - similar to which 但必须明确说明扩展名。
- https://www.npmjs.com/package/command-exists - 如果 fs.access return 无效,则使用子进程。