X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=appendu;h=460e363fd0223ad88718581cb7d3630da84fef58;hb=ff367964d27678cbbc93aff541e3b45274919668;hp=b613353af65fcd5eef8a3fd0c61491f4997ce6d2;hpb=6a2569e9a8060e05337def30facf98d6d73fb179;p=tee-unique diff --git a/appendu b/appendu index b613353..460e363 100755 --- a/appendu +++ b/appendu @@ -47,6 +47,17 @@ LINE_SETs are treated the same. return 1 fi fi + + local strings line + if (( $# == 0 )); then + unset IFS + while read -r line; do + strings+=( "$line" ) + done + else + strings=( "$@" ) + fi + if ! $new_file; then if [[ ! -r $file ]]; then echo "appendu error: cannot read or write $file" @@ -56,27 +67,21 @@ LINE_SETs are treated the same. echo "appendu error: cannot read or write $file" return 1 fi + # fix files with no newline at the end. + # the following command won't work right on them otherwise. + # e = run script, $a\ means append following text, but there is none, + # so sed only does what it always does when it was supposed to modify a file, + # which is append a newline if there was none. + sed -i '$a\' "$file" + # command substitution removes any trailing newlines, so we have to add + # a non-newline ending, we randomly chose "b", then remove it. + local content=$(cat "$file"; echo b) + content=${content%b} fi - if (( $# == 0 )); then - unset IFS - while read -r x; do - strings+=( "$x" ) - done - else - strings=( "$@" ) - fi - - # fix files with no newline at the end. - # the following command won't work right on them otherwise. - # e = run script, $a\ means append following text, but there is none, - # so sed only does what it always does when it was supposed to modify a file, - # which is append a newline if there was none. - sed -ie '$a\' "$file" - # command substitution removes any trailing newlines, so we have to add - # a non-newline ending, we randomly chose "b", then remove it. - content=$(cat "$file"; echo b) content=${content%b} - + local reset_extglob=false + ! shopt extglob >/dev/null && reset_extglob=true + shopt -s extglob # we aren't using regex because we want to match strings, # but we also want our match to start at the beginning of a line, # or the beginning of the file, and to end at a line ending. @@ -85,7 +90,7 @@ LINE_SETs are treated the same. )" local end=" *" - local return_code + local return_code string return_code for string in "${strings[@]}"; do if $new_file || [[ $content != $start"$string"$end ]]; then if ! tee -a "$file"<<<"$string"; then @@ -95,6 +100,7 @@ LINE_SETs are treated the same. fi fi done + $reset_extglob && shopt -u extglob return 0 } appendu "$@"