{"id":22837392,"url":"https://github.com/hubtou/pnu","last_synced_at":"2025-10-03T13:58:54.860Z","repository":{"id":57453791,"uuid":"348987976","full_name":"HubTou/PNU","owner":"HubTou","description":"The PNU project: a learning exercise to reimplement UNIX command-line tools in Python, forming a portable utilities collection","archived":false,"fork":false,"pushed_at":"2024-03-01T23:28:41.000Z","size":839,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-29T02:20:46.636Z","etag":null,"topics":["challenge-project","learning","learning-exercise","learning-python","learning-unix","pnu-project","portability","posix","python","shell","testing-tools","tools","unix","utilities"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HubTou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-03-18T07:59:18.000Z","updated_at":"2024-12-19T18:09:57.000Z","dependencies_parsed_at":"2025-04-24T03:38:03.294Z","dependency_job_id":null,"html_url":"https://github.com/HubTou/PNU","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/HubTou/PNU","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HubTou%2FPNU","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HubTou%2FPNU/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HubTou%2FPNU/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HubTou%2FPNU/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HubTou","download_url":"https://codeload.github.com/HubTou/PNU/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HubTou%2FPNU/sbom","scorecard":{"id":63590,"data":{"date":"2025-08-11","repo":{"name":"github.com/HubTou/PNU","commit":"9907cb50773db613f2048feaced800ef06d6d372"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: pipCommand not pinned by hash: _tools/slocc/slocc:20","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: License:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: License:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 2024.3.2 not signed: https://api.github.com/repos/HubTou/PNU/releases/144471608","Warn: release artifact 2024.2.21 not signed: https://api.github.com/repos/HubTou/PNU/releases/142948662","Warn: release artifact 2023.3.25 not signed: https://api.github.com/repos/HubTou/PNU/releases/96895990","Warn: release artifact 2022.3.17 not signed: https://api.github.com/repos/HubTou/PNU/releases/62114693","Warn: release artifact 2021.8.25 not signed: https://api.github.com/repos/HubTou/PNU/releases/48415130","Warn: release artifact 2024.3.2 does not have provenance: https://api.github.com/repos/HubTou/PNU/releases/144471608","Warn: release artifact 2024.2.21 does not have provenance: https://api.github.com/repos/HubTou/PNU/releases/142948662","Warn: release artifact 2023.3.25 does not have provenance: https://api.github.com/repos/HubTou/PNU/releases/96895990","Warn: release artifact 2022.3.17 does not have provenance: https://api.github.com/repos/HubTou/PNU/releases/62114693","Warn: release artifact 2021.8.25 does not have provenance: https://api.github.com/repos/HubTou/PNU/releases/48415130"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}}]},"last_synced_at":"2025-08-15T02:11:20.278Z","repository_id":57453791,"created_at":"2025-08-15T02:11:20.278Z","updated_at":"2025-08-15T02:11:20.278Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278173366,"owners_count":25942293,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["challenge-project","learning","learning-exercise","learning-python","learning-unix","pnu-project","portability","posix","python","shell","testing-tools","tools","unix","utilities"],"created_at":"2024-12-12T23:16:40.670Z","updated_at":"2025-10-03T13:58:54.853Z","avatar_url":"https://github.com/HubTou.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![PNU logo](https://github.com/HubTou/PNU/blob/main/_images/pnu-logo-and-title-small.png)\nPNU, as in [PNU is Not Unix](http://www.catb.org/jargon/html/R/recursive-acronym.html), is a challenge project and a learning exercise to reimplement [UNIX](https://en.wikipedia.org/wiki/Unix) command-line tools in [Python](https://www.python.org/), forming a kind of \"[pytnix](https://github.com/HubTou/pytnix)\" portable user-land utilities collection.\n\nIt's meant to be pronounced \"Pneu\" (tyre in French), a \"pun\" which seems appropriate as it's clearly another reinvention of the [wheel](http://www.catb.org/jargon/html/W/wheel.html), longtime after the [GNU project](https://www.gnu.org/gnu/thegnuproject.en.html) :-)\n\n## Objectives:\n* Originally intended as a [learning exercise](https://github.com/topics/learning-exercise) in Python/Unix for my son, but open to anyone.\n* Passing on some Unix culture \u0026 lore to a generation of [new hackers](http://www.catb.org/~esr/jargon/) (in the [original and noble meaning of the word](http://www.catb.org/~esr/jargon/html/H/hacker.html)).\n* Having some handy portable Unix tools, for example for Windows (though there are [plenty of other solutions](https://github.com/HubTou/PNU/wiki/Wilderness-Survival-Guide) for that).\n* Ultimately to have most of the relevant [standard utilities](https://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html) included in [POSIX.1](https://pubs.opengroup.org/onlinepubs/9699919799/nframe.html), many utilities sitting under /bin and /usr/bin in a modern [BSD](https://en.wikipedia.org/wiki/Berkeley_Software_Distribution)/[GNU Linux](https://en.wikipedia.org/wiki/Linux) system, some usual non-standard utilities, as well as some utilities of our own.\n\n## Project status:\n* The project is ongoing. You can install [what's available](https://github.com/HubTou/PNU/releases/latest) from [our package](https://pypi.org/project/PNU/) with the following console command:\n```Shell\npip install PNU\n```\nor you can install PNU plus a selection of additional third-parties tools with this command:\n```Shell\npip install pytnix\n```\n* This page is both for the challenge description and for referencing unix tools rewrites made by contributors.\n* To contribute you can simply create:\n  * your own Github repositories and link them to the project by using the [pnu-project](https://github.com/topics/pnu-project) topic\n  * your own [PyPi](https://pypi.org/) packages and link them to the project by using the [pnu-project](https://pypi.org/search/?q=pnu-project) keyword (but please don't use the \"pnu-\" package prefix for your own entries)\n\n## How to contribute:\n* As a player:\n  * Decide on a Unix command to reimplement in Python 3.x (see list below for suggestions or our [Master / targets list](https://github.com/HubTou/PNU/wiki/The-Monster-Manual) for full details).\n  * [Read the tutorials](https://github.com/HubTou/PNU/blob/main/_demos/README.md)\n  * [Read the guidelines for contribution](https://github.com/HubTou/PNU/wiki/The-Player's-Handbook) (among other [documentation manuals](https://github.com/HubTou/PNU/wiki))\n  * [Come discuss it with us on the forums](https://github.com/HubTou/PNU/discussions)\n* As an organizer:\n  * [Read the guidelines for organization](https://github.com/HubTou/PNU/wiki/Dungeon-Master's-Guide)\n\n## Suggested tasks and progression:\nThe following, [(A)D\u0026D](https://en.wikipedia.org/wiki/Dungeons_%26_Dragons) inspired, [level structure](https://github.com/HubTou/PNU/discussions/2) is proposed for [gamification](https://en.wikipedia.org/wiki/Gamification).\nWe suggest level bosses in order to complete a level (but no [Demogorgon](https://en.wikipedia.org/wiki/Demogorgon#Dungeons_\u0026_Dragons) here, we are not in [Stranger Things](https://en.wikipedia.org/wiki/Stranger_Things) :-)) and associated :trophy: trophies for fun :-)\n\nWe're also thinking about offering [Habitica](https://habitica.com/)'s quests for further gamification.\n\n`The following classification of commands is still in progress.`\n\n## Basic levels\n### Level 1 sub projects\nHandling return codes, printing to the terminal:\n* [true](https://www.freebsd.org/cgi/man.cgi?query=true), [false](https://www.freebsd.org/cgi/man.cgi?query=false)\n* [yes](https://www.freebsd.org/cgi/man.cgi?query=yes)\n* [echo](https://www.freebsd.org/cgi/man.cgi?query=echo) =\u003e suggested level boss. Trophy: :baby_bottle: (hint: option can be [hardcoded](http://www.catb.org/jargon/html/H/hardcoded.html))\n\n### Level 2 sub projects\nBasic [string handling](https://docs.python.org/3/library/string.html):\n* [basename, dirname](https://www.freebsd.org/cgi/man.cgi?query=basename) =\u003e without options for a start\n* [caesar, rot13](https://www.freebsd.org/cgi/man.cgi?query=caesar)\n\nBasic math or data structures, school level:\n* [factor, primes](https://www.freebsd.org/cgi/man.cgi?query=factor) =\u003e suggested level boss. Trophy: :school_satchel:\n\n### Level 3 sub projects\nBasic [filters](https://github.com/HubTou/PNU/tree/main/_demos/gorgon), command line \u0026 [environment](https://www.freebsd.org/cgi/man.cgi?query=environ) processing, file operations:\n* [basename](https://www.freebsd.org/cgi/man.cgi?query=basename) =\u003e with full options\n* [cat](https://www.freebsd.org/cgi/man.cgi?query=cat) =\u003e POSIX version only for a start\n* [head](https://www.freebsd.org/cgi/man.cgi?query=head)\n* [expand, unexpand](https://www.freebsd.org/cgi/man.cgi?query=expand)\n* [fold](https://www.freebsd.org/cgi/man.cgi?query=fold)\n* [wc](https://www.freebsd.org/cgi/man.cgi?query=wc) =\u003e suggested level boss. Trophy: :toilet:\n\n### Level 4 sub projects\nBasic text processing utilities, multiple files or many options:\n* [cat](https://www.freebsd.org/cgi/man.cgi?query=cat) =\u003e with full options\n* [nl](https://www.freebsd.org/cgi/man.cgi?query=nl)\n* [cmp](https://www.freebsd.org/cgi/man.cgi?query=cmp)\n* [comm](https://www.freebsd.org/cgi/man.cgi?query=comm)\n* [uniq](https://www.freebsd.org/cgi/man.cgi?query=uniq) =\u003e suggested level boss. Trophy: :one:\n\n### Level 5 sub projects\nBasic utilities using more complex parsing:\n* [expr](https://www.freebsd.org/cgi/man.cgi?query=expr) =\u003e just a warmer\n* [printf](https://www.freebsd.org/cgi/man.cgi?query=printf)\n* [getopts](https://www.freebsd.org/cgi/man.cgi?query=getopts)\n* [cut](https://www.freebsd.org/cgi/man.cgi?query=cut) =\u003e suggested level boss. Trophy: :scissors:\n\n## Intermediate levels\nSystem utilities (implying minimum Unix system knowledge).\n[Regular expressions](https://docs.python.org/3/library/re.html), text parsing.\n[CSV](https://docs.python.org/3/library/csv.html), [JSON](https://docs.python.org/3/library/json.html), [XML](https://docs.python.org/3/library/xml.html), [HTML](https://docs.python.org/3/library/html.html) data handling.\n\n### Level 6 sub projects\nBasic system utilities.\n\n### Level 7 sub projects\nBasic system utilities, possibly recursive ones:\n\n### Level 8 sub projects\n### Level 9 sub projects\n### Level 10 sub projects\n\n## Advanced levels\nFull screen text applications, windowed applications, office documents manipulation, image manipulation, web scraping, network applications, automation.\n\nInteractive full screen applications:\n* [vi](https://www.freebsd.org/cgi/man.cgi?query=vi)\n\nAdvanced system utilities, data compression:\n* [compress, uncompress](https://www.freebsd.org/cgi/man.cgi?query=compress)\n* [zcat](https://www.freebsd.org/cgi/man.cgi?query=zcat)\n\n### Level 11 sub projects\n### Level 12 sub projects\n### Level 13 sub projects\n### Level 14 sub projects\n### Level 15 sub projects\n\n## Master levels\nLanguages (interpreters, compilers), database management systems, network protocols:\n\n* [awk](https://www.freebsd.org/cgi/man.cgi?query=awk)\n\n### Level 16 sub projects\n### Level 17 sub projects\n### Level 18 sub projects\n### Level 19 sub projects\n \n### Level 20 sub projects\n* [sh](https://www.freebsd.org/cgi/man.cgi?query=sh) =\u003e Suggested level boss. Trophy: :shell:\n\n## Immortal levels\nIt's a long way to the top if you wanna get your entry in the \"Deities \u0026 [Demigods](http://www.catb.org/jargon/html/D/demigod.html)\" of hackers, but here are some examples to inspire you from the [Unix \u0026 open source pantheon](https://www.facesofopensource.com/unix/) (note: having a :neckbeard: [beard](http://jargonf.org/wiki/barbu) is not mandatory)\n\nHowever, all of this is beyond the scope of the project and probably not a good idea to implement in [Python](http://www.catb.org/jargon/html/P/Python.html) :-)\n\n### Demigods level transcending projects\nFull operating system kernels \u0026 device drivers:\n* Your own [Minix](https://en.wikipedia.org/wiki/Minix)/[386BSD](https://en.wikipedia.org/wiki/386BSD)/[Linux](http://www.catb.org/jargon/html/L/Linux.html) like operating system with PNU [userland](http://www.catb.org/jargon/html/U/userland.html) utilities :-)\n\n### Deities level transcending projects\nMaking your own hardware platform and all the software to run it.\n* Although not Unix related, :mage_man: [The Woz](https://en.wikipedia.org/wiki/Steve_Wozniak) springs to mind here and his excellent autobiography, [iWoz](https://en.wikipedia.org/wiki/IWoz), is highly recommended for a good glimpse into a true [hacker](http://www.catb.org/jargon/html/H/hacker.html)'s mind.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhubtou%2Fpnu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhubtou%2Fpnu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhubtou%2Fpnu/lists"}