#!/usr/bin/env bash TAPM_READ_MASKED() { local destination="$1" local character='' local value='' while IFS= read -r -s -n 1 character; do if [[ -z "$character" ]]; then break fi case "$character" in $'\177' | $'\b') if [[ -n "$value" ]]; then value="${value%?}" printf '\b \b' fi ;; *) value+="$character" printf '*' ;; esac done printf '\n' printf -v "$destination" '%s' "$value" }