首页 / 资讯中心 / 文章详情

cash-ls 完全指南:纯 ES6 跨平台实现的 Unix ls 命令

cash-ls 完全指南:纯 ES6 跨平台实现的 Unix ls 命令 ★ FEATURED ARTICLE
开发工具CLI【免费下载链接】cashCross-platform Linux commands in ES6项目地址https://gitcode.com/gh_mirrors/ca/cash点击查看免费下载导读cash-ls是 Cash 项目Cross-platform Linux commands in ES6中负责目录与文件列表的独立 npm 包它用 100% 纯 ES6 JavaScript 重新实现了 Unix 经典命令ls无需原生编译、无需 Cygwin 即可在 Windows、Linux 与 macOS 上获得一致的 Linux 风格体验。本文以 packages/ls/README.md 为骨架结合仓库内 src/commands/ls.js 的完整实现与 test/ls.js 的测试断言系统讲解cash-ls的安装方式、全部命令行选项、源码级排序/着色/排版原理、退出码约定及其在 Cash 生态中的三种使用形态读完后你可以独立安装使用它并理解其内部实现机制。一、cash-ls 是什么根据 packages/ls/README.mdcash-ls是 Unixls命令的跨平台、100% ES6 实现。它隶属于 Cash 项目——一个用纯 JavaScript 实现主流 Unix 命令的开源项目目标是让 JavaScript 开发者在不依赖原生编译的情况下在 Windows 上获得类 Linux 的终端体验并为跨平台 bash 风格的脚本执行打开大门。cash-ls的独立包信息记录在 packages/ls/package.json包名cash-ls版本0.2.0入口./dist/commands/ls.js全局命令映射bin: { ls: ./bin/ls.js }——安装后可直接以ls命令名调用运行时要求node 0.11.16或iojs 1.0.0核心依赖vorpal命令框架、chalk终端着色、filesize人类可读文件大小、glob通配符展开、lodash、vorpal-autocomplete-fs文件路径补全。二、安装与全局使用2.1 独立安装与单测命令需要整套工具链不同cash-ls允许只安装这一个命令npm install cash-ls -g全局安装后ls会被注册到系统 PATH 中对应 packages/ls/package.json 中bin字段的ls映射之后在任何终端中都可以直接敲ls使用。2.2 查看内置帮助安装完成后输入 ls --help会打印由 src/help/ls.js 提供的完整帮助文本包含用法、全部选项与退出码说明。其开头的用法行是Usage: ls [OPTION]... [FILE]... List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -tSU nor --sort is specified.注意末尾的排序声明当未指定-t、-S、-U等排序选项时默认按字母序排序这一点与 GNU ls 保持一致。2.3 三种使用形态Cash 生态中ls有三种使用方式源码支撑位于 src/index.jsCash 交互式 Shell 内npm install cash -g后输入cash进入$提示符直接执行ls -lah全局命令通过cash-global一次性将所有命令安装到系统 PATH在 commands.json 中ls不在globalExclusions列表内因此会被全局暴露程序化调用require(cash)后调用$.ls(., {l: true})或使用模板字符串形式执行整段命令例如const $ require(cash); const out $.ls(., {l: true}); // 返回长格式列表文本 // 或者用字符串/模板字面量 require(cash) ls -la ;程序化调用路径中src/util/interfacer.js 负责统一命令函数与调用方Vorpal 或cash.xxxAPI之间的接口它把命令的this.log输出累积为 stdout 字符串并通过回调返回同时支持silent模式与异步命令。三、命令行选项总览下表完整继承自 src/help/ls.js 的帮助文本并标注了 Vorpal 注册定义见 src/commands/ls.js 末尾的.option(...)链选项长选项作用Vorpal 注册-a--all不忽略以.开头的条目列出隐藏文件及.、..✅-A--almost-all不列出隐含的.和..但列出其他隐藏文件✅-d--directory只列出目录本身而非其内容且不解引用符号链接✅-f—不排序启用-aU禁用-ls --color❌帮助文本保留-F--classify给条目追加类型指示符*/\|之一实际实现为目录追加/✅-h--human-readable配合-l以人类可读格式输出大小如 1K 234M 2G✅-i--inode打印每个文件的索引号inode✅-l—使用长列表格式✅-q--hide-control-chars用?代替非图形字符❌帮助文本保留-Q--quote-name用双引号括住条目名✅-r--reverse反向排序✅-R--recursive递归列出子目录✅-S—按文件大小排序✅-t—按修改时间排序最新在前✅-U—不排序按目录顺序列出条目✅-w--widthCOLS假定屏幕宽度为 COLS 而非当前值✅-w, --width [COLS]-x—按行列出条目而非按列✅-1—每行只列一个文件✅实现说明帮助文本中的-f与-q沿用了 GNU ls 的文档条目但当前 src/commands/ls.js 的 Vorpal 命令注册链中并未定义这两个选项属于文档层面的预留项--help由 Vorpal 框架统一提供。帮助文本同时给出了退出码约定与实现 src/commands/ls.js 中error()的返回逻辑一致Exit status: 0 if OK, 1 if minor problems (e.g., cannot access subdirectory), 2 if serious trouble (e.g., cannot access command-line argument).四、核心选项的源码级行为解析4.1 排序默认字母序-S大小、-t时间、-U不排序、-r反向排序逻辑集中在 src/commands/ls.js 的execLsOnFiles中。默认未指定-U时会对条目调用sort默认字母序取文件名经 src/util/fileFromPath.js 剥离路径得到短名.trim().toLowerCase().replace(/\W/g, )后比较即不区分大小写、忽略非单词字符的字母序-S按大小a.data.size大者在前。实现里还包含一个 Windows 兼容 hack——当平台为win32且目录大小为 0 时将其视为 4096以避免因 Linux/Windows 对目录 size 统计不一致导致排序结果漂移-t按修改时间比较mtime最新在前-U不排序保持目录读取的原始顺序在 Windows 上目录顺序本就与 Linux 不同测试中对该项做了平台判断见 test/ls.js 的-U用例-r反向在完成上述任一排序后对数组执行reverse()。此外在进入execLsOnFiles之前preSortPaths会把用户传入的多个路径先分为dirs与files两组并各自排序文件始终列在目录之前测试断言ls([./sub, b.tgz, ., a.txt])输出为文件在前、目录按.:、./sub:分段展示。4.2 隐藏文件-a、-A与-d的过滤逻辑execLsOnFiles中的include过滤函数精确实现了 GNU ls 语义普通文件!dotted→ 默认显示点开头文件.hidden等→ 仅当-a/--all或-A/--almost-all时显示隐含条目.与..→ 仅-a/--all时显示-A会排除它们-d/--directory→ 只包含.一个条目且文件名替换为传入的完整路径fileName (options.directory file .) ? path : fileName。4.3 文件着色目录、可执行文件与扩展名src/commands/ls.js 的着色顺序是普通文件先交给 src/util/colorFile.js 按扩展名着色音频类mp3、wav、ogg 等→ 青色压缩包/归档类zip、tar、gz、7z 等→ 红色图片/视频类jpg、gif、png、mp4 等→ 品红若文件未被着色且权限串见下含x可执行则用chalk.green染成绿色目录统一用chalk.cyan染成青色。所有 ANSI 转义在计算对齐宽度时都会被 src/util/stripAnsi.js 剥除避免着色码干扰列宽计算。4.4 权限、时间、大小的格式化工具权限src/util/converter.permissions.js 把fs.statSync的mode与0o777做与运算后转八进制再经listing映射表0→---… 7→rwx拼成-rwxr-xr-x形式的 RWX 串时间src/util/converter.date.js 将mtime格式化为 Unix 风格Mon DD HH:MM如Oct 14 00:22日个位前补空格大小-h/--human-readable时调用filesize库并以{unix: true}模式输出1K 234M 2G形式的单位。4.5 显示修饰-F分类、-Q引号、-iinode、-1单行-F/--classify目录名后追加/-Q/--quote-name条目名用双引号包裹-i/--inode在长列表的细节列最前面插入data.ino索引号-1强制每行一个条目files.join(\n)。五、输出格式长列表与列排版5.1-l长列表execLsOnFiles为每个条目组装细节数组[typepermissions, hardLinks, owner, group, size, modified, fileName]其中type为目录d或文件-。-l开启时逐行输出并在formatAll中打印total size汇总行totalSize为所有条目 size 之和。5.2 多目录输出的分段规则formatAll的showName逻辑见 src/commands/ls.js当传入多个路径或多个目录时每个目录输出前冠以路径:标题行目录间以空行分隔仅单个目录时不打印标题行只在-l时打印total行。5.3 列排版与宽度控制默认非-l、非-1的输出交由 src/util/columnify.js 处理其算法取最长条目长度 2 作为列宽基准屏幕宽度取自process.stdout.columns若总宽度全部条目拼接 每项 2 个空格不超过屏幕宽度则直接以双空格连接成一行否则计算列数cols floor(width / longest)至少为 1逐列填充并用 src/util/pad.js 补齐当列数退化为 1 时不做填充避免超长文件名被空格撑爆。-w/--width允许显式指定列宽基准如ls -w 20-x则绕过列排版、按行依次输出每个条目-1同样按行但每条独占一行。测试中{width: 5}与-1的断言均为每个文件各占一行见 test/ls.js 的file display分组。六、命令执行链路从参数到 stdout结合 src/commands/ls.js 与 src/index.js一次ls调用的完整链路为参数解析Vorpal 按ls [paths...]收集路径.parse(preparser)先经 src/preparser.js 展开$VAR/${VAR}环境变量路径展开expand(paths)src/util/expand.js用glob.sync将*.gif之类的通配符展开为真实路径无匹配时保留原样测试断言ls(*.gif)输出e.gif路径归类preSortPaths用fs.statSync判断每个路径是目录还是文件不存在时报ls: cannot access path: No such file or directory对应退出码 1ENOENTsyscallscandir分支其余异常退出码 2 并输出堆栈目录扫描execDir总是先压入.与..两个隐含条目再经 src/util/walkDir.js 的fs.readdirSyncstatSync遍历目录内容-R/--recursive时改走 src/util/walkDirRecursive.js对每个子目录递归调用execDir并合并结果格式化execLsOnFiles完成排序、过滤、着色与细节组装formatDetails决定输出长列表、单行列表或列排版输出统一stdout.replace(/\\/g, /)把 Windows 反斜杠路径规整为正斜杠后经this.log输出成功返回退出码 0。七、测试验证行为即规范test/ls.js 通过构造固定样例目录a.txt、b.tgz、c.exe、d.json、e.gif、f.jpg、g、.hidden及子目录sub见 test/util/util.js对cash.ls的 API 形态做了精确断言例如默认列当前目录a.txt b.tgz c.exe d.json e.gif f.jpg g sub\n-a输出含.、..与.hidden-A输出.hidden但不含隐含条目-F给sub追加/-Q全部条目加双引号多个路径混排文件在前目录以./sub:标题分段错误场景单个不存在文件返回一行ls: cannot access aaa: No such file or directory两个不存在文件返回两行且不存在的文件不影响其余文件的正常输出-l输出必须包含total、-rw权限前缀、硬链接数1、e.gif与sub等字段-h时大小出现3.6K形式-R递归输出../atatatest/foo:\nbar\n\n../atatatest/foo/bar:\ncows.file结构。这些用例直接对应 packages/ls/README.md 所声称的“对 Unixls的近似实现”也是验证源码行为最可靠的依据。八、包的组织与构建方式packages/ls/README.md本身由 gulpfile.js 的packages任务基于 packages/template.README.md 模板生成将{package-name}替换为cash-ls、{command-name}替换为ls并批量写入各命令的说明与依赖清单。ls子包在 commands.json 中声明的独立依赖为lodash、chalk、filesize、vorpal-autocomplete-fs、glob随包发布的文件包括dist/commands/ls.js以及colorFile、columnify、converter.date、converter.permissions、expand、fileFromPath、interfacer、pad/lpad、stripAnsi、walkDir/walkDirRecursive等工具模块保证了子包脱离主仓库后仍可独立运行。九、在 Cash 生态中的定位Cash 主项目根目录 README.md以纯 ES6、零原生编译、超 200 个单元测试为目标实现 20 常用 Unix 命令。cash-ls与cash-cat、cash-cp、cash-rm、cash-grep等同级子包共同构成命令矩阵仓库内各子包说明见 packages/cat/README.md、packages/cp/README.md 等。两种按需安装方式全量命令npm install cash-global -g安装后直接ls -lah按需单命令npm install cash-ls -g只获得ls。cash-ls之所以能“按需独立”正是因为它构建在 Vorpal 命令框架之上命令注册代码见 src/commands/ls.js 末尾的module.exports同时通过 src/util/interfacer.js 与 Cash 的程序化 API 无缝对接实现“命令行、交互式 Shell、Node 程序”三端复用同一套实现。十、开源与许可证cash-ls与整个 Cash 项目采用 MIT 许可证见根目录 LICENSE 与 packages/ls/package.json 的license字段。在 Windows 上使用本命令时注意实现中对目录 size、路径分隔符、隐藏文件顺序等做了平台兼容处理个别行为如-S在 Windows 目录上的排序、-U的原始顺序会与 Linux 存在细微差异测试中也对此做了相应标注见 test/ls.js 中的平台判断与it.skip用例。赞分享开发工具CLI【免费下载链接】cashCross-platform Linux commands in ES6项目地址https://gitcode.com/gh_mirrors/ca/cash点击查看免费下载相关推荐Cash命令实现详解从ls命令看ES6实现技巧Cash命令实现详解从ls命令看ES6实现技巧 本文深入分析了Cash项目中ls命令的完整实现展示了ES6在现代命令行工具开发中的强大能力。通过模块化架构设开发工具CLIcash-cat 实战指南用纯 ES6 跨平台复刻 Unix cat 命令cash cat 实战指南用纯 ES6 跨平台复刻 Unix cat 命令 cash cat 是 Cash 项目中以 100% ES6 重新实现的 Unix开发工具CLIcash-kill 深度指南在 Node.js 与 Windows 中跨平台使用 Unix kill 命令cash kill 深度指南在 Node.js 与 Windows 中跨平台使用 Unix kill 命令 导读 cash kill 是 Cash 项目Cr开发工具CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站