Puede usar un comando de contenedor que:
- cambia el nombre del archivo
- ejecuta el visor en segundo plano
- se limpia cuando el espectador ha regresado en lugar de dejar
mutt
que lo haga.
Algo como:
#! /bin/sh -
TMPDIR=$(
mutt -D 2> /dev/null |
awk -F\" '
$1 == "tmpdir=" {
gsub("~", ENVIRON["HOME"], $2)
print $2
exit
}'
)
[ -n "$TMPDIR" ] || exit
export TMPDIR
nargs=$#
nfiles=0
for i do
case $i in
("$TMPDIR"/?*)
new_file=$(mktemp -ut "XXXXX${i##*/}") &&
mv -- "$i" "$new_file" &&
nfiles=$(($nfiles + 1)) &&
set -- "$new_file" "$@" "$new_file" &&
continue
esac
set -- "$@" "$i"
done
run_command() (
shift "$(($nargs + $nfiles))"
exec "$@"
)
(
run_command "$@"
while [ "$nfiles" -gt 0 ]; do
set -- "$@" "$1"
shift
nfiles=$(($nfiles - 1))
done
shift "$((2*$nargs))"
rm -f -- "$@"
) &
Y pon algo como:
image/*; muttv eog %s;
¿Dónde muttv
está ese guión de arriba?
Lo anterior no presupone dónde aparecen los nombres de los nombres de archivo en la lista de argumentos o qué caracteres contienen ... Por eso primero preguntamos mutt
qué tmpdir
es (por lo que usamos eso para determinar a qué archivos pertenecen) vista ).
Sin embargo, en la mayoría de los casos, sería excesivo, y como señala Gilles, puede no funcionar si tmpdir se especifica como relativo a la carpeta de su buzón.
Una más simple sería:
#! /bin/sh -
nargs=$#
eval "file=\${$nargs}"
newfile=$(dirname -- "$file")/new-$(basename -- "$file")
while [ "$nargs" -gt 1 ]; do
set -- "$@" "$1"
shift
nargs=$(($nargs - 1))
done
shift
mv -- "$file" "$newfile" || exit
(
"$@" "$newfile"
rm -f -- "$newfile"
) &
Reemplace mv
con cp
si no desea tocar el archivo original proporcionado por mutt
.