#! /bin/sh set -euf bs="# begin krebs magic <$2>" es="# end krebs magic <$2>" has() { grep -q "^$bs$" $3 && grep -q "^$es$" $3 } create() { destroy "$@" cat>>$3<<EOF $bs `cat` $es EOF } retrieve() { sed -n "/^$bs$/,/^$es$/p" $3 | sed '1d;$d' } update() { ! has "$@" || create "$@" } destroy() { if has "$@"; then cache="`cat $3`" echo "$cache" | sed "/^$bs$/,/^$es$/d" >$3 fi } help() { cat <<EOF Usage: $0 FUNCTION DELIMITER_NAME FILE $0 creates,updates or destroys magic inside a file. It can be used to reliably add or remove custom lines. For example add own lines in /etc/rc.local to auto-load scripts. FUNCTION: create -- creates new magic in file, takes stdin as content in magic update -- updates already existing magic with text from stdin destroy -- destroys magic boundary retrieve -- retrieve the content of magic and writes to stdout Not yet implemented is the handling of magic not starting with the shell comment symbol "#". EOF } case $1 in (create) create "$@" ;; (retrieve) retrieve "$@" ;; (update) update "$@" ;; (destroy) destroy "$@" ;; (*) help >&2 echo 'Error 1: You are made of stupid!' >&2 exit 23 esac