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? <insert sounds of cars crashing in the background>

Oops (from the treeversion 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):

> STDDATA_FD=1 tree | from json

|-#-|---type----|-name-|------------------contents-------------------|-directories-|-files-|
| 0 | directory | .    | |-#--|-type-|------------name-------------| |    nope     | nope  |
|   |           |      | |  0 | file | 2024-01-01-test.md          | |             |       |
|   |           |      | |  1 | file | 2024-03-04-htmnix.md        | |             |       |
|   |           |      | |  2 | file | 2024-04-02-cosmic-drift.md  | |             |       |
|   |           |      | |  3 | file | 2024-04-15-nix-iceberg.md   | |             |       |
|   |           |      | |  4 | file | 2024-05-20-swap-i.md        | |             |       |
|   |           |      | |  5 | file | 2024-09-30-gitignore.md     | |             |       |
|   |           |      | |  6 | file | 2025-06-05-why-cores.md     | |             |       |
|   |           |      | |  7 | file | 2025-06-09-nginix.md        | |             |       |
|   |           |      | |  8 | file | 2025-06-20-intro-cab.md     | |             |       |
|   |           |      | |  9 | file | 2025-07-04-derive-broken.md | |             |       |
|   |           |      | | 10 | file | 2025-07-20-no-gnulib.md     | |             |       |
|   |           |      | | 11 | file | _data.ts                    | |             |       |
| 1 | report    | nope |                    nope                     |           1 |    12 |