From the tree(1) release notes, version 2.0.0:
Output un-indented JSON on file descriptor 3 ("stddata") automatically if file descriptor 3 is present (currently Linux only.) Maybe switch to BSON.
Surely, nothing will happen if I just assume that the existence of a specific file descriptor implies something, as nobody is crazy or stupid enough to hardcode such a thing?
Oops (from the tree version 2.0.2 release notes):
Okay, apparently the stddata addition is causing havoc (who knew how many scripts just haphazardly hand programs random file descriptors, that's surely not a problem.) Going forward the stddata option will only work if the environment variable STDDATA_FD is present or set to the descriptor to produce the JSON output on.
Assuming anything about the users environment is and will always be a mistake. But it's still cool we can have tree output structured data using STDDATA_FD :
> STDDATA_FD= 1 tree [ { "type" : "directory" , "name" : "." , "contents" : [ { "type" : "file" , "name" : "2024-01-01-test.md" } , { "type" : "file" , "name" : "2024-03-04-htmnix.md" } , { "type" : "file" , "name" : "2024-04-02-cosmic-drift.md" } , { "type" : "file" , "name" : "2024-04-15-nix-iceberg.md" } , { "type" : "file" , "name" : "2024-05-20-swap-i.md" } , { "type" : "file" , "name" : "2024-09-30-gitignore.md" } , { "type" : "file" , "name" : "2025-06-05-why-cores.md" } , { "type" : "file" , "name" : "2025-06-09-nginix.md" } , { "type" : "file" , "name" : "2025-06-20-intro-cab.md" } , { "type" : "file" , "name" : "2025-07-04-derive-broken.md" } , { "type" : "file" , "name" : "2025-07-20-no-gnulib.md" } , { "type" : "file" , "name" : "_data.ts" } ] } , { "type" : "report" , "directories" : 1 , "files" : 12 } ]
Also, obligatory nushell mention (using the markdown table style because for some reason the fancy characters don't render properly with my webfont):