ich habe es jetzt nochmal überarbeitet und das Anlegen eines error-logs eingebaut, also zwischen jedem "||" und "exit" steht nun noch " >> "$logfile" 2>&1". Für die logs habe ich einfach in $HOME einen Ordner .var angelegt...
Außerdem habe ich doch noch die Funktionen von der Schreibweise her vereinheitlicht. Da ich mittlerweile vim nutze (habe mich endlich dafür bereit gefühlt) ist das jetzt ganz locker mit ":%s/string/newstring/gc" sogar mit Nachfrage zu erledigen...
Code: Alles auswählen
#!/bin/bash
# License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
# This is free software; you are free to change and redistribute it.
# There is NO WARRANTY, to the extent permitted by law.
dmenu_cmd () { dmenu -i -l 25; }
type_cmd () { file -b --mime-type -- "$list"; }
tool_cmd () { sed -n "/^${type//\//\\/}/ {s@^.*=@$apps_path@;s/\;.*//p;q}" -- "$HOME/.config/mimeapps.list"; }
comppre_cmd () { sed -n '/\[Desktop Entry\]/,/^Exec=/!d;s/^Exec=//p' -- "$tool"; }
testterm_cmd () { grep -q '^Terminal=true' -- "$tool"; }
show_cmd () { echo 'An error occurred. Please press Enter.' | dmenu_cmd > /dev/null; }
perm_cmd () { echo "$list: Permission denied" | dmenu_cmd > /dev/null; }
noapp_cmd () { echo "There's no app specified for $type in mimeapps.list" | dmenu_cmd > /dev/null; }
apps_path="$HOME/.local/share/applications/"
logfile="$HOME/.var/fm.log"
while true; do
input="$(printf '%s\n../\n%s\n' "$(pwd)" "$(LC_ALL="C" ls -1 --group-directories-first -F)" | dmenu_cmd)" >> "$logfile" 2>&1 || exit
case "$input" in
*"*")
list="${listtmp%?}"
;;
*)
list="$input"
;;
esac
if [[ -d "$list" ]]; then
if [ -x "$list" ]; then
cd -- "$list" >> "$logfile" 2>&1 || exit
else
perm_cmd
fi
elif [[ -f "$list" ]]; then
if [[ -r "$list" ]]; then
type="$(type_cmd)" >> "$logfile" 2>&1 || exit
tool="$(tool_cmd)" >> "$logfile" 2>&1 || exit
if [[ ! -r "$tool" ]]; then noapp_cmd; continue >> "$logfile" 2>&1 || exit; fi
if testterm_cmd; then
urxvt -e bash -c -- "$(comppre_cmd) -- $list" &
else
exec $(comppre_cmd) "$list" &
fi
exit
else
perm_cmd
fi
else
case "$list" in
'///+')
while true; do
input="$(printf '%s\n../\n%s\n' "$(pwd)" "$(LC_ALL="C" ls -lAh --group-directories-first -F)" | dmenu_cmd)" >> "$logfile" 2>&1 || exit
case "$input" in
"///q")
continue 2 >> "$logfile" 2>&1 || exit
;;
"///"*)
COM="${input#\/\/\/}"
eval "$COM" >> "$logfile" 2>&1 || show_cmd
continue >> "$logfile" 2>&1 || exit
;;
*)
case "$input" in
*"*")
listtmp="${input#*:???}" && list="${listtmp%?}"
;;
*)
list="${input#*:???}"
;;
esac
if [[ -d "$list" ]]; then
if [[ -x "$list" ]]; then
cd -- "$list" >> "$logfile" 2>&1 || exit
else
perm_cmd
fi
elif [[ -f "$list" ]]; then
if [[ -r "$list" ]]; then
type="$(type_cmd)" >> "$logfile" 2>&1 || exit
tool="$(tool_cmd)" >> "$logfile" 2>&1 || exit
if [[ ! -r "$tool" ]]; then noapp_cmd; continue >> "$logfile" 2>&1 || exit; fi
if testterm_cmd; then
urxvt -e bash -c -- "$(comppre_cmd) -- $list"
else
exec $(comppre_cmd) "$list"
fi
else
perm_cmd
fi
else
show_cmd
fi
;;
esac
done
;;
*)
case "$list" in
"///"*)
COM2="${list#\/\/\/}"
eval "$COM2" >> "$logfile" 2>&1 || show_cmd
continue >> "$logfile" 2>&1 || exit
;;
*)
show_cmd
;;
esac
;;
esac
fi
done