bhylu.com

Advertisements

Bash rm

Remove one exact disposable file and prove that a neighbour survives.

How it works

rm removes directory entries; it is not a recycle-bin operation or a guaranteed secure erasure mechanism. Quote the filename and separate it from options with --. This exercise removes only a file created by the same listing inside a verified private workspace. Recursive removal requires an explicit ownership and path boundary, not merely a variable that happens to be nonempty.

Run the code

Reviewed with Git for Windows Bash 5.2.37. Open Git Bash, save the download with LF line endings in a separate learning folder, check it with bash -n lesson-name.sh, then run bash lesson-name.sh using the actual filename. Bash 4 or newer is required for the full course. Linux-only notes identify unavailable tools or POSIX behaviour. There is no Bash browser runner; Apache and MySQL are not required.

This complete example was executed in the stated local review environment.

The complete source creates a fresh private temporary workspace and checks its physical path before cleanup. All file fixtures belong to that workspace; do not remove the guards or point it at existing documents.

Download complete source

Example

rm.sh

#!/usr/bin/env bash
set -u
set -o pipefail
export LC_ALL=C

# Own a new directory; verify physical paths before cleanup.
parent=$(cd -- "${TMPDIR:-/tmp}" && pwd -P) || exit 1
work=$(mktemp -d "$parent/bhylu-bash.XXXXXX") || exit 1
work=$(cd -- "$work" && pwd -P) || exit 1
case "$work" in "$parent"/bhylu-bash.??????) ;; *) exit 1 ;; esac
cleanup() {
    cd -- "$parent" || return 1
    [[ -d $work && ! -L $work ]] || return 1
    [[ $(cd -- "$work" && pwd -P) == "$work" ]] || return 1
    case "$work" in "$parent"/bhylu-bash.??????) rm -r -- "$work" ;; *) return 1 ;; esac
}
trap cleanup EXIT
cd -- "$work" || exit 1

printf "temporary\n" > ./-draft.txt
printf "keep\n" > keep.txt
rm -- ./-draft.txt
[[ ! -e ./-draft.txt && -f keep.txt ]] || exit 1
printf "Only the exact disposable draft removed\n"

Focus on the lesson commands

This excerpt omits temporary-workspace setup and cleanup. Use the complete source above to run the example.

Command excerpt

printf "temporary\n" > ./-draft.txt
printf "keep\n" > keep.txt
rm -- ./-draft.txt
[[ ! -e ./-draft.txt && -f keep.txt ]] || exit 1
printf "Only the exact disposable draft removed\n"

Expected result

Only the exact disposable draft removed

The leading dash in the disposable name demonstrates why option separation matters. keep.txt acts as a neighbour sentinel. The shared workspace cleanup is separately guarded to its generated temporary directory. No learner document, application file or external directory is selected by this lesson.

Primary technical reference: Bash documentation.