"변수" 앰퍼샌드(백그라운드 프로세스)

"변수" 앰퍼샌드(백그라운드 프로세스)

앰퍼샌드를 변수에 넣고 이를 사용하여 프로세스를 백그라운드로 보내는 방법이 있는지 궁금합니다.

이것은 작동합니다:

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설정하는 것은 정말 혼란스럽습니다. 적절한 변수 이름은 독자에게 연습용으로 남겨 둡니다.)FOREGROUNDtrue

답변3

다음을 사용해야 할 수도 있습니다 eval.

eval "sleep 5" "$BCKGRND"

eval쉘이 주어진 인수를 재평가하도록 합니다. 따라서 리터럴은 명령에 대한 인수가 아닌 명령 끝에 있는 &것으로 해석되어 명령을 백그라운드에 배치합니다.&

관련 정보