NOBODD-SH(1)

πŸ“¦ version 0.5, in ubuntu resolute, ubuntu stonking

πŸ’… NOBODD-SH(1) β€” the nobodd-sh page, bestie edition ✨

okay so. this is the manual page for nobodd-sh, living in section 1 of the nobodd manual. sit down, grab a snack, we're doing this πŸ“

✨ NAME ✨

nobodd-sh β€” run shell-like commands against files within images πŸ¦‹

Basically: you get to run shell-ish commands against the file-system and/or FAT partitions inside a file-system image. it's giving "scripts that prep images for the nobodd-tftpd server", and honestly? iconic. that's the whole point of it πŸ’–


✨ SYNOPSIS ✨

usage: nobodd-sh [-h] [--version] [-v] [-q]
                 {help,cat,rm,rmdir,mkdir,touch,ls,cp,mv} ...

✨ OPTIONS ✨

  • -h, --help β€” shows this help message and dips. bye bestie πŸ‘‹
  • --version β€” prints the program's version number and exits ✨
  • -v, --verbose β€” more output. we love a talkative queen πŸ‘‘
  • -q, --quiet β€” no output at all. silent. mysterious. main character energy πŸ’…

✨ SUB-COMMANDS ✨

so the first mandatory thing you pass to nobodd-sh is the sub-command you want to run. every one of them is named after the standard POSIX shell utility it's cosplaying as, and every one implements a similar but much more limited set of options. notably: filenames you hand to these utilities get treated pretty differently from how their regular shell counterparts treat them. iykyk 😭

🌸 help

with no arguments, it shows you a list of the nobodd-sh help commands. give it a command name and it shows you the description and options for that named command. so helpful fr fr 🫢

usage: nobodd-sh help [-h] [command]
  • command β€” the command you want help for; the valid ones are shown in the sections below πŸ‘‡
  • -h, --help β€” show this help message and exit

🐱 cat

concatenates the content of the given files and writes it to stdout by default. if - shows up as a filename, or if you give it no filenames at all, it reads stdin instead. and because output can go into a file inside an image, there's -o for specifying an output that isn't stdout. slay 🌈

usage: nobodd-sh cat [-h] [-o filename] [filenames ...]
  • filenames β€” the input files
  • -h, --help β€” show this help message and exit
  • -o filename, --output filename β€” the output file (default: stdout)

πŸ¦‹ cp

copies the specified file over the target file β€” but only if you give it one single source. if the target is a directory, it copies the specified files and directories into that target directory instead πŸŽ€

usage: nobodd-sh cp [-h] filenames [filenames ...] dest
  • filenames β€” the files or directories to copy
  • dest β€” the directory to copy into, or the file to replace
  • -h, --help β€” show this help message and exit

πŸ‘‘ ls

lists info about the files you name, or the contents of the directories you name. entries get sorted alphabetically unless you explicitly ask for another ordering. by default, hidden files (the ones starting with .) are left out of the output unless -a is provided. yes, exactly like regular ls, we stay consistent πŸ’…

usage: nobodd-sh ls [-h] [-a] [-l] [--sort SORT] [-U] [-S] [-t] [-X]
                    filenames [filenames ...]
  • filenames β€” the files or directories to list
  • -h, --help β€” show this help message and exit
  • -a, --all β€” do not ignore entries beginning with . (show the hidden girlies πŸ™ˆ)
  • -l β€” show details beside the listed entries
  • --sort SORT β€” sort on "name" (the default), "size", "time", or "none" to disable sorting
  • -U β€” disable sorting
  • -S β€” sort by file size (largest first)
  • -t β€” sort by modification time (newest first)
  • -X β€” sort by entry extension

🌸 mkdir

creates the directories you specify β€” and those directories must not already exist, neither as directories nor as regular files. no take-backs, no merge 🚫

usage: nobodd-sh mkdir [-h] [-p] filenames [filenames ...]
  • filenames β€” the directories to create
  • -h, --help β€” show this help message and exit
  • -p, --parents β€” create parent directories as required

🧚 mv

moves the specified file over the target file when only one source is given, or moves the specified files and directories into the target directory when the target is a directory ✨

usage: nobodd-sh mv [-h] filenames [filenames ...] dest
  • filenames β€” the files or directories to copy
  • dest β€” the directory to move into, or the file to replace
  • -h, --help β€” show this help message and exit
warning, bestie, this one matters: unlike regular mv, there is no guarantee of atomic operation here, particularly with respect to files within images. so yeah. plan accordingly 😭

πŸ’€ rm

removes the files you specify. hand it -r and it will recursively remove directories and their contents too. gone. deleted. not coming back 🫢

usage: nobodd-sh rm [-h] [-r] [-f] filenames [filenames ...]
  • filenames β€” the files or directories to remove
  • -h, --help β€” show this help message and exit
  • -r, -R, --recursive β€” remove directories and their contents recursively
  • -f, --force β€” do not error on non-existent arguments, and never prompt

πŸŽ€ rmdir

removes the directories you specify β€” which must be empty. no contents allowed, it's a strict vibe 😀

usage: nobodd-sh rmdir [-h] filenames [filenames ...]
  • filenames β€” the directories to remove
  • -h, --help β€” show this help message and exit

⭐ touch

updates last-modified timestamps, and creates any files that don't already exist while it's at it πŸ’–

usage: nobodd-sh touch [-h] filenames [filenames ...]
  • filenames β€” the files to create or modify the timestamps of
  • -h, --help β€” show this help message and exit

✨ USAGE ✨

okay here's the tea β˜• filenames get parsed as regular filenames unless they contain ":/" or ":N/", where N is a partition number. when that happens:

  • the part before ":" is treated as an image file
  • the N (if you specified one) is the partition within that image β€” and if you didn't specify N, the first auto-detected FAT partition gets used
  • the part from "/" onwards is an absolute path within that partition

which means this application can copy (or move) files to / from / within FAT file-systems inside images. obsessed 🌈

for example:

  • foo.txt will be interpreted as an ordinary file in the file-system
  • foo.img:/foo.txt will be interpreted as the file foo.txt in the root of the first FAT partition found within the disk image foo.img
  • foo.img:10/foo.txt will be interpreted as the file foo.txt in the root of the 10th partition found in the disk image foo.img
please be aware: nobodd-sh does not perform file-locking [1]. therefore it is possible β€” but definitely not advisable β€” to open the same partition in the same image in two parallel nobodd-sh processes. this is extremely likely to lead to corruption of the FAT file-system if both processes are writing to that partition. and even if one process is read-only and the other is read-write, it's still not safe, because the reading process may read the wrong data depending on what the writing process does. so like. don't 😭

✨ EXAMPLES ✨

query the current kernel command line in an image πŸ”

$ nobodd-sh cat ~/images/ubuntu-26.04.img:1/current/cmdline.txt
console=serial0,115200 multipath=off dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 panic=10 rootwait fixrtc

copy the kernel command line to the local file-system, edit it with sed, and move it back into the image πŸ’…

$ nobodd-sh cp ~/images/ubuntu-26.04.img:1/current/cmdline.txt ./
$ sed -i -e 's/panic=10/panic=5/' cmdline.txt
$ nobodd-sh mv cmdline.txt ~/images/ubuntu-26.04.img:1/current/

doing the same with the cat -o option with a pipe from sed πŸŽ€

$ nobodd-sh cp ~/images/ubuntu-26.04.img:1/current/cmdline.txt ./
$ sed -i -e 's/panic=10/panic=5/' cmdline.txt | \
  nobodd-sh cat -o ~/images/ubuntu-26.04.img:1/current/cmdline.txt

checking the content of the current bootloader assets in the image πŸ¦‹

$ nobodd-sh ls -l ~/images/ubuntu-26.04.img:/current/
-r--r--r--  1 root root    32503 Oct 23 13:41 bcm2710-rpi-2-b.dtb
-r--r--r--  1 root root    35330 Oct 23 13:41 bcm2710-rpi-3-b-plus.dtb
-r--r--r--  1 root root    34695 Oct 23 13:41 bcm2710-rpi-3-b.dtb
-r--r--r--  1 root root    33684 Oct 23 13:41 bcm2710-rpi-cm0.dtb
-r--r--r--  1 root root    32266 Oct 23 13:41 bcm2710-rpi-cm3.dtb
-r--r--r--  1 root root    33672 Oct 23 13:41 bcm2710-rpi-zero-2-w.dtb
-r--r--r--  1 root root    33672 Oct 23 13:41 bcm2710-rpi-zero-2.dtb
-r--r--r--  1 root root    56289 Oct 23 13:41 bcm2711-rpi-4-b.dtb
-r--r--r--  1 root root    56293 Oct 23 13:41 bcm2711-rpi-400.dtb
-r--r--r--  1 root root    39913 Oct 23 13:41 bcm2711-rpi-cm4-io.dtb
-r--r--r--  1 root root    56810 Oct 23 13:41 bcm2711-rpi-cm4.dtb
-r--r--r--  1 root root    53510 Oct 23 13:41 bcm2711-rpi-cm4s.dtb
-r--r--r--  1 root root    78638 Oct 23 13:41 bcm2712-d-rpi-5-b.dtb
-r--r--r--  1 root root    78642 Oct 23 13:41 bcm2712-rpi-5-b.dtb
-r--r--r--  1 root root    78598 Oct 23 13:41 bcm2712-rpi-500.dtb
-r--r--r--  1 root root    79591 Oct 23 13:41 bcm2712-rpi-cm5-cm4io.dtb
-r--r--r--  1 root root    79657 Oct 23 13:41 bcm2712-rpi-cm5-cm5io.dtb
-r--r--r--  1 root root    79632 Oct 23 13:41 bcm2712-rpi-cm5l-cm4io.dtb
-r--r--r--  1 root root    79698 Oct 23 13:41 bcm2712-rpi-cm5l-cm5io.dtb
-r--r--r--  1 root root    78646 Oct 23 13:41 bcm2712d0-rpi-5-b.dtb
-r--r--r--  1 root root      132 Oct 23 13:41 cmdline.txt
-r--r--r--  1 root root 78601311 Oct 23 13:41 initrd.img
dr-xr-xr-x  2 root root        0 Jan  1  1970 overlays
-r--r--r--  1 root root        5 Oct 23 13:41 state
-r--r--r--  1 root root 13783000 Oct 23 13:41 vmlinuz

✨ SEE ALSO ✨

go read these next, bestie πŸ“š

✨ BUGS ✨

please report bugs at: <https://github.com/waveform80/nobodd/issues> πŸ› (do it, they wanna know)

[1] for all the reasons that one should generally avoid file-locking on Linux; see On the Brokenness of File Locking <https://0pointer.de/blog/projects/locking.html> for more

✨ Author ✨

Dave Jones πŸ’œ

2023-2026 Dave Jones


and that's a wrap, babe 🫢 this was version 0.5, dated Feb 19, 2026, and yeah β€” the page header up top said NOBODD-SH(1) with nobodd as the manual, and the footer said exactly the same thing on the other end. slay, go run some commands πŸ’…βœ¨

πŸ“¦ where this page comes from