#!/usr/bin/env bash set -eu -o pipefail while getopts v option; do case $option in v) pmenu -v exit ;; esac done prev_ifs=$IFS IFS=$'\n' desktop_dirs=(${XDG_DATA_HOME-~/.local/share}/applications /usr/share/applications) desktop_paths=(`find "${desktop_dirs[@]}" -type f -name "*.desktop" ! -name "chrome-*-*.desktop" 2>/dev/null || :`) desktop_names=("${desktop_paths[@]##*/}") desktop_names=("${desktop_names[@]%.desktop}") IFS=$prev_ifs result=`IFS=$'\n'; echo "${desktop_names[*]}" | sort -u | pmenu -n run "$@"` for i in ${!desktop_names[@]}; do [[ ${desktop_names[$i]} == $result ]] || continue desktop_path=${desktop_paths[$i]} break done if [[ ! ${desktop_path-} ]]; then cmd=$result else cmd=`grep -oP -m 1 "(?<=^Exec=).+" "$desktop_path"` cmd=${cmd// -[[:alnum:]]* %[[:alpha:]]/} cmd=${cmd// %[[:alpha:]]/} grep -q ^Terminal=true "$desktop_path" || exec nohup setsid $cmd > /dev/null fi printf "\e]0;${cmd%% *}\a" exec $cmd