rename to more logical name. symlink old name cuz it could break stuff master
authorIan Kelling <iank@fsf.org>
Thu, 5 Feb 2026 23:04:00 +0000 (18:04 -0500)
committerIan Kelling <iank@fsf.org>
Thu, 5 Feb 2026 23:04:00 +0000 (18:04 -0500)
appu [new file with mode: 0755]
teeu [changed from file to symlink]

diff --git a/appu b/appu
new file mode 100755 (executable)
index 0000000..6c97ba1
--- /dev/null
+++ b/appu
@@ -0,0 +1,79 @@
+#!/bin/bash
+# I, Ian Kelling, follow the GNU license recommendations at
+# https://www.gnu.org/licenses/license-recommendations.en.html. They
+# recommend that small programs, < 300 lines, be licensed under the
+# Apache License 2.0. This file contains or is part of one or more small
+# programs. If a small program grows beyond 300 lines, I plan to switch
+# its license to GPL.
+
+# Copyright 2024 Ian Kelling
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+#     http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+appu() {
+  local help="Usage: appu [-h|--help|-v] FILE [LINE]
+Append unique: Appends line(s) to FILE if they are not already in FILE.
+
+If no LINE is specified, process each line from STDIN.
+
+Appu is like ainsl, but with plain verbatim strings and no automatic
+escaping.
+
+-v         verbose. Prints each line added to the file.
+-h|--help  display this message
+"
+  local verbose=false
+
+  if ! temp=$(getopt -l help: hv "$@"); then
+    echo "appu: unexpected options."
+    echo "$help"
+    return 1
+  fi
+  eval set -- "$temp"
+  while true; do
+    case $1 in
+      -v[) verbose=true ;;
+      -h|--help)
+        echo "$help"
+        return 0
+        ;;
+      --) shift; break ;;
+      *) echo "$0: Internal error! unexpected args: $*" ; return 1 ;;
+    esac
+    shift
+  done
+
+  if (( ${#@} == 0 )) ; then
+    echo "appu error: need 1 or more arguments"
+    echo "$help"
+    return 1
+  fi
+  file="$1"
+  shift
+  local MAPFILE
+  if [[ $1 ]]; then
+    MAPFILE=("$@")
+  else
+    mapfile -t
+  fi
+  for line in "${MAPFILE[@]}"; do
+    if $verbose; then
+      grep -xFq "$line" "$file" &>/dev/null || tee -a "$file" <<<"$line"
+    else
+      grep -xFq "$line" "$file" &>/dev/null || printf "%s\n" "$line" >>"$file"
+    fi
+  done
+  return 0
+}
+appu "$@"
diff --git a/teeu b/teeu
deleted file mode 100755 (executable)
index 9daedb77b836460799b17513a02bdee1130dff0e..0000000000000000000000000000000000000000
--- a/teeu
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/bin/bash
-# I, Ian Kelling, follow the GNU license recommendations at
-# https://www.gnu.org/licenses/license-recommendations.en.html. They
-# recommend that small programs, < 300 lines, be licensed under the
-# Apache License 2.0. This file contains or is part of one or more small
-# programs. If a small program grows beyond 300 lines, I plan to switch
-# its license to GPL.
-
-# Copyright 2024 Ian Kelling
-
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-
-#     http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-teeu() {
-  local help="Usage: teeu [-h|--help] FILE [LINE]
-Append LINE if it's not already in FILE
-
-If no LINE is specified, process each line from STDIN.
-teeu is short for tee unique.
-
--h|--help  display this message"
-
-  if [[ $1 == --help || $1 == -h ]]; then
-    echo "$help"
-    return
-  fi
-
-  if (( ${#@} == 0 )) ; then
-    echo "teeu error: need 1 or more arguments"
-    echo "$help"
-    return 1
-  fi
-  file="$1"
-  shift
-  local MAPFILE
-  if [[ $1 ]]; then
-    MAPFILE=("$*")
-  else
-    mapfile -t
-  fi
-  for line in "${MAPFILE[@]}"; do
-    grep -xFq "$line" "$file" &>/dev/null || tee -a "$file" <<<"$line"
-  done
-  return 0
-}
-teeu "$@"
diff --git a/teeu b/teeu
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..b0fdd8131643f6dfa1e30d04a5cec20049c1f9d3
--- /dev/null
+++ b/teeu
@@ -0,0 +1 @@
+appu
\ No newline at end of file