"[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 & ; 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

다른 옵션

사용zsh/schedzsh 모듈 또는 외부 스크립트(예:zsh-defer또는zsh-async.

관련 정보