fix missing extglob
[tee-unique] / appendu-function
index 37c7b1e9635a271cd68b083d0b40794493df4b45..13a7d740cd51548714ce6ff28730af2a495a3ada 100644 (file)
@@ -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 -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.
+        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,5 +100,6 @@ LINE_SETs are treated the same.
             fi
         fi
     done
+    $reset_extglob && shopt -u extglob 
     return 0
 }