답변:
제어 연산자 (예 : &&
및 &
)에 대해 명령 줄을 구문 분석 한 후 변수 확장이 발생하므로 변수를 사용하여 호출을 백그라운드로 지정할 수 없습니다 .
또 다른 옵션은 호출을 함수로 감싸는 것입니다.
mayberunbg() {
if [ "$BCKGRND" = "yes" ]; then
"$@" &
else
"$@"
fi
}
... 그리고 필요에 따라 변수를 설정하십시오.
$ BCKGRND=yes mayberunbg sleep 3
[1] 14137
$
[1]+ Done "$@"
# or
$ BCKGRND=yes
$ mayberunbg sleep 3
[1] 14203
$
[1]+ Done "$@"
$ BCKGRND=no mayberunbg sleep 3
# 3 seconds later
$
ed
? 어쨌든 +1, 이것이 가장 깨끗한 솔루션입니다.
물건을 뒤집어 놓고“전경”을 변호 할 수 있습니다.
FOREGROUND=fg
sleep 5 & ${FOREGROUND}
설정 FOREGROUND
에 true
또는 백그라운드에서 프로세스를 실행 웁니다. ( 백그라운드에서 실행 FOREGROUND
하도록 설정 하는 true
것은 당연히 혼동됩니다! 적절한 변수 이름은 독자에게 연습으로 남겨 둡니다.)
set -m
사용 되지 않은 스크립트 ).
아마도 다음을 사용해야 할 것입니다 eval
.
eval "sleep 5" "$BCKGRND"
eval
쉘이 주어진 인수를 다시 평가하게합니다. &
따라서 리터럴 은 &
명령의 끝이 아닌 명령의 인수로 해석되어 백그라운드에서 명령을 해석 합니다.
"$BCKGRND"
빈 논증 을 평가할 때 문제가 무엇인지 알지 못한다 .
eval
는 실제 평가를 수행하기 전에 공백과 인수에 합류합니다. 시도해보십시오 : eval printf "'{%s}\n'" foo "" "" ""
. 또는 다른 것이 무엇 이든 간에 eval foo "" "" "" ""
완전히 유사합니다 . eval foo
IFS
eval 'sleep $TIMEOUT' "$BACKGROUND"
. 그렇지 않으면 변수가 다른 변수로 확장되거나 특수 문자가 포함되어 있으면 이중 확장을 얻을 수 있습니다. 또한 중첩 인용은 까다로울 수 있습니다.
echo $!
PID를 반환