bhylu.com

Advertisements

Bash cp

Copy a known source and verify the bytes before using the copy.

How it works

cp creates a copy of file contents, with metadata handling controlled by its options and platform. Decide how existing destinations are handled before running unattended work. An explicit existence check makes this small example refuse replacement, though it is not a concurrency-safe creation protocol. A production workflow with concurrent writers needs atomic creation or another coordinated policy.

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

cp.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 "desk revision 1\n" > source.txt
[[ ! -e copy.txt ]] || exit 1
cp -- source.txt copy.txt
cmp -- source.txt copy.txt || exit 1
printf "Copy matches source\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 "desk revision 1\n" > source.txt
[[ ! -e copy.txt ]] || exit 1
cp -- source.txt copy.txt
cmp -- source.txt copy.txt || exit 1
printf "Copy matches source\n"

Expected result

Copy matches source

cmp compares the actual bytes rather than only file sizes. The original remains available, and the destination name is fixed inside the owned workspace. A copy’s successful exit status does not prove an external disk is durable or that all intended metadata was preserved. Verify the properties your use case actually requires.

Primary technical reference: Bash documentation.

Advertisements