내 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
다른 옵션