앰퍼샌드 "가변 화"(배경 프로세스)


9

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

이것은 작동합니다 :

BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
    sleep 5 &
else
    sleep 5
fi

그러나이 5 가지 라인을 단 하나만 사용하는 것이 멋지지 않습니까? 이렇게 :

BCKGRND='&'
sleep 5 ${BCKGRND}

그러나 그것은 작동하지 않습니다. BCKGRND가 설정되지 않으면 작동하지만 설정되면 리터럴 '&'로 해석되고 오류가 발생합니다.


후행를 사용하여 앰퍼샌드 후, echo $!PID를 반환
noobninja

답변:


9

제어 연산자 (예 : &&&)에 대해 명령 줄을 구문 분석 한 후 변수 확장이 발생하므로 변수를 사용하여 호출을 백그라운드로 지정할 수 없습니다 .

또 다른 옵션은 호출을 함수로 감싸는 것입니다.

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, 이것이 가장 깨끗한 솔루션입니다.
Stephen Kitt

LOL @StephenKitt; 이제 기어가 돌고 있습니다
Jeff Schaller

나는 그 단순성에 대한 평가 답변을 좋아했지만 배경으로 내 실제 실제 명령은 너무 많은 변수로 너무 복잡하여 eval을 사용하기에 너무 복잡했습니다. @ jeff-schaller는 내가 갔던 방향을 알려주는 대답을주었습니다. 그러나 함수 대신 전체 명령을 변수에 넣은 다음 if 문 스타일을 사용하여 &를 사용하거나 사용하지 않고 명령을 실행했습니다.
BrowncoatOkie

11

물건을 뒤집어 놓고“전경”을 변호 할 수 있습니다.

FOREGROUND=fg
sleep 5 & ${FOREGROUND}

설정 FOREGROUNDtrue또는 백그라운드에서 프로세스를 실행 웁니다. ( 백그라운드에서 실행 FOREGROUND하도록 설정 하는 true것은 당연히 혼동됩니다! 적절한 변수 이름은 독자에게 연습으로 남겨 둡니다.)


4
훌륭하지만 작업 제어가없는 쉘에서는 작동하지 않습니다 (예 : set -m사용 되지 않은 스크립트 ).
mosvy 2016 년

9

아마도 다음을 사용해야 할 것입니다 eval.

eval "sleep 5" "$BCKGRND"

eval쉘이 주어진 인수를 다시 평가하게합니다. &따라서 리터럴 은 &명령의 끝이 아닌 명령의 인수로 해석되어 백그라운드에서 명령을 해석 합니다.


2
대답 eval에는주의해서 다루어야한다는 경고가 포함되어야합니다. 예를 들어이 답변을 참조하십시오 .
Ralf

나는 "$BCKGRND"빈 논증 을 평가할 때 문제가 무엇인지 알지 못한다 .
mosvy

2
이 경우 @Ralf는 절대 관련 없습니다 . eval에는 특별한 것이 없습니다. 예를 들어 산술 확장을 통해 명령을 실행할 수 있습니다. 어쩌면 bash (또는 다른 유사한 쉘)를 전혀 사용하지 말라고 경고해야 할 수도 있습니다. ;-)
mosvy

1
@Kusalananda eval는 실제 평가를 수행하기 전에 공백과 인수에 합류합니다. 시도해보십시오 : eval printf "'{%s}\n'" foo "" "" "". 또는 다른 것이 무엇 이든 간에 eval foo "" "" "" ""완전히 유사합니다 . eval fooIFS
mosvy 2016 년

1
평가중인 명령에 특수 문자가 포함 된 경우 큰 따옴표로 묶어야합니다 (예 :) eval 'sleep $TIMEOUT' "$BACKGROUND". 그렇지 않으면 변수가 다른 변수로 확장되거나 특수 문자가 포함되어 있으면 이중 확장을 얻을 수 있습니다. 또한 중첩 인용은 까다로울 수 있습니다.
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.