다음 명령을 평가하기 위해 쉘 프로세스를 생성하여 평가가 작동합니까?

다음 명령을 평가하기 위해 쉘 프로세스를 생성하여 평가가 작동합니까?

에서 다음 명령을 평가하는 eval <command>방법은 무엇입니까 ?eval

  • eval평가를 위한 쉘 하위 프로세스를 생성하시겠습니까 <command>?

  • 그렇지 않은 경우 eval현재 쉘 프로세스를 사용하여 평가합니까?

알아채다

  • eval내장 프로세스이므로 eval자체적으로 하위 프로세스가 생성되지 않습니다.
  • <command>실행 전에 자식 프로세스가 <command>내장 프로세스인지 여부에 따라 이를 실행하기 위해 생성될 수도 있고 생성되지 않을 수도 있습니다.

위 명령을 평가하는 데 사용된 쉘 하위 프로세스는 주석에 언급된 두 가지 중 하나가 아닙니다.

감사해요.

답변1

작동하는 것은 eval매개변수 구문 분석, 변수 확장 등을 수행한 다음 결과 문자열을 정상적으로 실행하는 것입니다.

예를 들면 다음과 같습니다.

$ i=ls
$ eval $i

이는 다음 으로 eval대체됩니다 .$ils그 다음에ls정상적으로 명령을 실행하십시오(그러면 프로세스가 실행 fork()됩니다 ).exec()ls

하지만 그렇게 한다면

$ i="echo hello"
$ eval $i
hello

echo hello그러면 내장 프로세스로 실행되므로 새 프로세스가 생성되지 않습니다 .

변수를 설정하면 쉘이 생성되지 않음을 알 수 있습니다.

$ a=0
$ i="a=100"
$ eval $i
$ echo $a
100

$a현재 쉘 내에서 수행되는 경우에만 100으로 설정할 수 있습니다.

따라서 이는 eval실제로 파서 그 자체이며 현재 셸에서 수행됩니다.결과이 문자열은 다른 명령과 마찬가지로 새 프로세스를 생성할 수도 있고 생성하지 않을 수도 있습니다.

답변2

아래에서 무슨 일이 일어나고 있는지는 모르지만 실제로는 다음과 같이 작동합니다. source somefile새 프로세스를 생성하지 않고 현재 쉘 프로세스에서 이러한 명령을 실행합니다.

그리고 저는 "명령" 대신 "문자열"이라는 단어를 사용하겠습니다. 왜냐하면 이것이 바로 문자열이기 때문입니다. 이것은 작동하지만 다음 명령이 없습니다.

$ eval ""

또는 이것은 기술적으로 명령이 아닙니다.

$ eval "x(){ echo test;}"
$ x
test

그리고 항상 새로운 프로세스를 만드는 것은 아니라는 점을 보여주기 위해(따라서 저는 William의 의견에 동의하지 않습니다):

터미널에서:

$ echo $$
9983
$ eval "sleep 100"  

또 다른:

$ ps -ef --forest
peter     9983  2840  0 14:21 pts/41   00:00:00  \_ /bin/bash
peter    17339  9983  0 14:26 pts/41   00:00:00  |   \_ sleep 100

하지만 이렇게 하면 다음과 같은 이유가 있습니다.

$ eval 'sleep 100' &
[1] 20675

$ ps --forest
  PID TTY          TIME CMD
 9983 pts/41   00:00:00 bash
20675 pts/41   00:00:00  \_ bash
20676 pts/41   00:00:00  |   \_ sleep
20757 pts/41   00:00:00  \_ ps

답변3

평가는 단지 이를 위해 새로운 프로세스를 생성하지 않습니다 eval.

대신 Eval은 -인수 연결을 사용하여 파서를 다시 실행합니다 eval.

그러면 구문 분석된 결과가 동일한 셸에서 실행됩니다. 그러나 인수가 명령에 대한 하위 쉘을 생성해야 하는 경우에는 이것이 수행됩니다.

따라서 eval의 주요 목적은 파서를 다시 실행하는 것입니다.

답변4

이것을 시도해 보세요: 평가 중과 $$평가 전 사이를 확장합니다.''$$""

$ eval /bin/echo '$$' "$$"
17899 17899

따라서 둘 다 동일한 프로세스에서 확장되므로 eval로 시작되는 하위 쉘이 없습니다. 저는 쉘이 아닌 함수인 echo를 사용했습니다.

관련 정보