cash-ls 完全指南:纯 ES6 跨平台实现的 Unix ls 命令
开发工具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),仅供参考

相关新闻

Flutter 无限列表实战:基于 ListView.builder 懒加载机制的 Infinite List 示例深度解析

Flutter 无限列表实战:基于 ListView.builder 懒加载机制的 Infinite List 示例深度解析

示例工程移动开发 【免费下载链接】flutter-examples [Examples] Simple basic isolated apps, for budding flutter devs. 项目地址: https://gitcode.com/gh_mirrors/fl/flutter-examples 点击查看 免费下载 导读 本文以 flutter-examples 仓库中的 infinite_li…

2026/10/15 18:54:42 阅读更多 →
AI EASY获得2026京津冀算力算法大赛一等奖

AI EASY获得2026京津冀算力算法大赛一等奖

近日,京津冀算力算法大赛圆满落幕。AI EASY凭借在安全算法架构、算力资源利用效率、多模态风险识别、私有化部署与产业化应用方面的几大核心优势,获得评审团高度认可,荣获大赛一等奖。本次大赛聚焦算力优化、国产算力适配、产业赋能升级与场景…

2026/10/15 18:54:42 阅读更多 →
改造 MSF Meterpreter 提升稳定性:Viper 平台下的 CS Beacon 式实战方案

改造 MSF Meterpreter 提升稳定性:Viper 平台下的 CS Beacon 式实战方案

文档教程网络安全 【免费下载链接】Viper Adversary simulation and Red teaming platform with AI 项目地址: https://gitcode.com/gh_mirrors/vip/Viper 点击查看 免费下载 Meterpreter 与 Cobalt Strike Beacon 是红队模拟中最常用的两种后渗透工具,…

2026/10/15 18:54:42 阅读更多 →

最新新闻

AI论文写作要点梳理与前沿研究成果应用实践指南

AI论文写作要点梳理与前沿研究成果应用实践指南

外文文献“白嫖”与高效阅读全攻略 宝子们,是不是一提到下载外文文献就头大? 想找的文献要么全网搜不到,要么下载流程复杂到让人原地爆炸。好不容易在某个小网站找到了资源,又担心版权问题不敢点,更别说有些平台动辄几…

2026/10/15 19:38:32 阅读更多 →
人脸识别开集测试:从闭集幻觉到真实拒识的工程实践

人脸识别开集测试:从闭集幻觉到真实拒识的工程实践

1. 开集与闭集测试:人脸识别系统落地前必须跨过的那道坎 我第一次在某高校实验室参与人脸识别项目验收时,被现场演示结果惊得愣在原地——模型在内部测试集上准确率高达99.2%,可当现场随机邀请三位未录入过人脸的访客走进识别区域&#xff0c…

2026/10/15 19:38:32 阅读更多 →
深耕支付宝收钱码推广领域,拓推客以专业合作服务赋能地推从业者

深耕支付宝收钱码推广领域,拓推客以专业合作服务赋能地推从业者

移动支付已深度融入日常消费与商业经营场景。线下商户对于便捷收款、数字化经营工具及相关支付服务的需求持续受到关注,与之相关的商户拓展和推广服务,也逐渐成为连接支付产品与线下经营场景的重要环节。在这一行业背景下,专业化、规范化的推…

2026/10/15 19:38:32 阅读更多 →
记忆系统演化:从简单缓存到多层认知架构

记忆系统演化:从简单缓存到多层认知架构

在大模型驱动的智能体(AI Agent)系统研发初期,绝大多数团队对“记忆”的理解仅仅停留在会话上下文的传递上。早期的 LangChain 会话记忆组件(如 ConversationBufferMemory 或 ConversationSummaryMemory)通过简单的字符…

2026/10/15 19:38:32 阅读更多 →
观测全景:基于 OpenInference 的可观测体系总结

观测全景:基于 OpenInference 的可观测体系总结

随着大语言模型(LLM)与多智能体(Multi-Agent System)系统从概念验证(POC)全面进入企业生产级核心业务,传统的微服务可观测性体系(Metrics、Logs、Traces)遭遇了前所未有的…

2026/10/15 19:38:32 阅读更多 →
OpenCV+Python轻量物体识别:纯CPU端到端方案

OpenCV+Python轻量物体识别:纯CPU端到端方案

简介:本资源是一套面向Python与OpenCV初学者及计算机视觉入门开发者的自定义物体识别实战教程,聚焦于零基础构建可识别任意目标的检测模型,适用于智能监控、工业质检、教学实验等场景。压缩包共709个文件,含663张标注用JPG图像、2…

2026/10/15 19:37:32 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →