web-dev-qa-db-ja.com

アタッチメントプログラムが戻るのを待たないようにmuttに指示するにはどうすればよいですか?

mailcapの画像にこの行を使用します:

image/*; eog %s &;

しかし、muttはすぐに一時ファイルを削除し、eogはそれをロードできません。
&を削除すると、muttはコマンドラインからエスケープするまでeogが閉じられるのを待ちます。

9
Profpatsch

これが私が使うものです:

。mailcap:

application/*; mkdir -p /tmp/mutt \; cp %s /tmp/mutt \; xdg-open /tmp/mutt/$(basename %s) &

。mutt/muttrc:

folder-hook . `rm -f /tmp/mutt/*`

添付ファイルを開こうとするたびに、専用の一時ディレクトリにコピーされ、コピーが開かれます。
muttを開始するたびに、残っているコピーはすべてクリーンアップされます。

使用したコマンドに応じて、最後に&が必要な場合と不要な場合があります。 (xdg-openの一部のバージョンはブロックしていますが、他のバージョンはブロックしていません。)

言うまでもなく、これはどのコマンドでも使用できます。 xdg-openは便利なワンストップハンドラーです。

9
user18469

次のようなラッパーコマンドを使用できます。

  1. ファイルの名前を変更します
  2. ビューアをバックグラウンドで実行します
  3. muttに実行させるのではなく、ビューアが戻ったときにクリーンアップします。

何かのようなもの:

#! /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 -- "$@"
) &

そして、次のようなものを置きます:

image/*; muttv eog %s;

ここで、muttvは上記のスクリプトです。

上記は、ファイル名が引数のリストのどこに表示されるか、またはそれらに含まれる文字を想定していません...そのため、最初にmuttにそのtmpdirが何であるかを尋ねます。 (したがって、これを使用して、viewのファイルを判別します)。

ただし、ほとんどの場合、それはやり過ぎであり、Gillesが指摘しているように、tmpdirがメールボックスフォルダーを基準にして指定されている場合は機能しない可能性があります。

より単純なものは次のとおりです。

#! /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"
) &

mvによって提供された元のファイルに触れたくない場合は、cpmuttに置き換えます。

3