「[1] + did $scriptname」と「[1] 31303」を表示しない

「[1] + did $scriptname」と「[1] 31303」を表示しない

私の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 & ; muttrun-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

その他のオプション

使用zsh/schedzshモジュールまたは外部スクリプト(例:zsh-deferまたはzsh-async

関連情報