#!/usr/bin/env bash shopt -s nullglob globstar typeit=0 otp=0 infer_otp=0 otp_pattern="" while [[ $# -gt 0 ]]; do argument="$1" shift case $argument in --type) typeit=1 ;; --otp) otp=1 ;; --infer-otp) infer_otp=1 ;; --otp-pattern) otp_pattern="$1"; shift ;; esac done prefix=${PASSWORD_STORE_DIR-~/.password-store} password_files=( "$prefix"/**/*.gpg ) password_files=( "${password_files[@]#"$prefix"/}" ) password_files=( "${password_files[@]%.gpg}" ) if [[ $otp -eq 1 ]]; then filtered_files=() for file in "${password_files[@]}"; do [[ "$file" =~ $otp_pattern ]] && filtered_files+=("$file") done password_files=(${filtered_files[@]}) fi password=$(printf '%s\n' "${password_files[@]}" | dmenu "$@") [[ -n $password ]] || exit if [[ $infer_otp -eq 1 ]]; then [[ "$password" =~ $otp_pattern ]] && otp=1 fi otp_arg='' if [[ $otp -eq 1 ]]; then otp_arg='otp' fi if [[ $typeit -eq 0 ]]; then pass $otp_arg show -c "$password" 2>/dev/null else pass $otp_arg show "$password" | { IFS= read -r pass; printf %s "$pass"; } | xdotool type --clearmodifiers --file - fi