私のmutt:のエイリアスを設定しましたalias mutt='$HOME/.mutt/run-notmuch-offlineimap & ; mutt'
。
ノート:私のエイリアスを次に変更するか、alias mutt='$HOME/.mutt/run-notmuch-offlineimap 2> /dev/null & ; mutt'
まったくalias mutt='$HOME/.mutt/run-notmuch-offlineimap 2>&1 >/dev/null & ; mutt'
同じ結果を生成します。
スクリプトはrun-notmuch-offlineimap
次のとおりです。
#!/usr/bin/env zsh
notmuch="$(which notmuch)"
$notmuch new --quiet
$notmuch tag +inbox -- "folder:dev/dev|INBOX or folder:pers/pers|INBOX"
$notmuch tag +sent -- "folder:dev/dev|Sent or folder:pers/pers|Sent"
$notmuch tag +drafts -- "folder:dev/dev|Drafts or folder:pers/pers|Sent"
$notmuch tag +github -- "folder:dev/dev|github and not tag:github"
# test if the offlineimap instance of account dev is already running
if [[ $(pgrep -f 'offlineimap.*dev.*') == "" ]]
then
offlineimap -c "$HOME/.fetch-send-mail/dev/dev.imap" -u quiet
fi
# test if the offlineimap instance of account dev is already running
if [[ $(pgrep -f 'offlineimap.*pers.*') == "" ]]
then
offlineimap -c "$HOME/.fetch-send-mail/pers/pers.imap" -u quiet
fi
(このスクリプトでbashを使用すると、結果はまったく同じです)
muttを起動すると、次のことが起こります。
~
$ mutt
[1] 31303
Mailbox is unchanged.
# some seconds afterwards:
~
$
[1] + done $HOME/.mutt/run-notmuch-offlineimap
~
「メールボックスが変更されていません」というメッセージはmutt自体からのものであるため、これは予想されます。しかし、[1]
メッセージが表示されないようにすることはできますか?たとえば、私がmuttを実行した場合は、次のように印刷する必要があります(他は何も印刷しません)。
~
$ mutt
Mailbox is unchanged.
~
$
どうすればいいですか?
答え1
zshにある場合は、エイリアスを変更&!
して&
。否定するのコース。
alias mutt='$HOME/.mutt/run-notmuch-offlineimap &! mutt'
Bashにいる場合は、disown
コマンドの後に使用して同様の効果を得ることができますが、まだpidを一覧表示する最初のジョブ制御メッセージを受け取ります。
alias mutt='$HOME/.mutt/run-notmuch-offlineimap & disown; mutt'
サブシェルを使用すると、両方の状況を回避できます。
alias mutt='($HOME/.mutt/run-notmuch-offlineimap &); mutt'
答え2
説明する
[1] + done <scriptname> ... [1] 31303
シェル(zsh)から印刷職業管理。これはコマンドを非同期的に実行した結果です&
。
お客様の場合は、mutt
エイリアスが指定されて非同期$HOME/.mutt/run-notmuch-offlineimap & ; mutt
にrun-notmuch-offlineimap
実行され、開始および完了時にジョブ制御メッセージが印刷されます。
例:
$ { sleep .3; echo; } &
[1] 71975
$
[1] + 71975 done { sleep .3; echo; }
考えられる解決策
MONITOR
シェルオプションの設定解除
$ unsetopt MONITOR # or set +m
$ { sleep .3; echo; } &
# (no job control messages)
# reset the option:
$ setopt MONITOR # or set -m
これにより、ジョブ制御メッセージが表示されなくなります。また、そのジョブはジョブリスト(jobs
)に追加されません。
ドキュメントから:
- オプション、16.2.7 ジョブ制御:
MONITOR (-m, ksh: -m) Allow job control. Set by default in interactive shells.
- 10.1 タスク
If the MONITOR option is set, an interactive shell associates a job with each pipeline. It keeps a table of current jobs, printed by the jobs command, and assigns them small integer numbers. When a job is started asynchronously with ‘&’, the shell prints a line to standard error which looks like: [1] 1234
&!
代わりに実行&
非同期コマンドは直ちに拒否され、タスクリストから削除されます。
$ { sleep .3; echo; } &!
# (no job control messages)
サブシェルで非同期コマンド自体を実行します。
$ ({ sleep .3; echo; } &)
# (no job control messages)
(上記のように非同期的に実行することは(サブシェル自体が)非同期的に実行されない{..}
ため意味がありません(..)
。したがって、コマンド全体がブロックされます。)
しかし、なぜサブシェルで非同期コマンドを実行すると、ジョブ制御出力が抑制されますか?理由:MONITOR
シェルオプションはサブシェルには設定されません(親シェルに設定されている内容に関係なく)。
$ setopt monitor;
$ [[ -o monitor ]] && echo "SET" || echo "UNSET"
SET
$ ( [[ -o monitor ]] && echo "SET" || echo "UNSET" )
UNSET
その他のオプション