앰퍼샌드를 변수에 넣고 이를 사용하여 프로세스를 백그라운드로 보내는 방법이 있는지 궁금합니다.
이것은 작동합니다:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
하지만 이 다섯 줄을 단 하나로 완성하면 멋지지 않을까요? 이와 같이:
BCKGRND='&'
sleep 5 ${BCKGRND}
그러나 이것은 작동하지 않습니다. BCKGRND가 설정되지 않으면 작동하지만 설정되면 문자 그대로 "&"로 해석되어 오류가 발생합니다.
답변1
제어 연산자(예: &&
및 )에 대해 명령줄을 구문 분석한 &
후에 변수 확장이 발생하므로 백그라운드 호출에 변수를 사용할 수 없습니다.
또 다른 옵션은 호출을 함수로 래핑하는 것입니다.
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
$
답변2
상황을 뒤집고 "전경"을 변경할 수 있습니다.
FOREGROUND=fg
sleep 5 & ${FOREGROUND}
백그라운드에서 프로세스를 실행하려면 FOREGROUND
로 설정 하거나 비워두세요. ( 백그라운드에서 실행 되도록 true
설정하는 것은 정말 혼란스럽습니다. 적절한 변수 이름은 독자에게 연습용으로 남겨 둡니다.)FOREGROUND
true
답변3
다음을 사용해야 할 수도 있습니다 eval
.
eval "sleep 5" "$BCKGRND"
eval
쉘이 주어진 인수를 재평가하도록 합니다. 따라서 리터럴은 명령에 대한 인수가 아닌 명령 끝에 있는 &
것으로 해석되어 명령을 백그라운드에 배치합니다.&