에서 다음 명령을 평가하는 eval <command>
방법은 무엇입니까 ?eval
eval
평가를 위한 쉘 하위 프로세스를 생성하시겠습니까<command>
?그렇지 않은 경우
eval
현재 쉘 프로세스를 사용하여 평가합니까?
알아채다
eval
내장 프로세스이므로eval
자체적으로 하위 프로세스가 생성되지 않습니다.<command>
실행 전에 자식 프로세스가<command>
내장 프로세스인지 여부에 따라 이를 실행하기 위해 생성될 수도 있고 생성되지 않을 수도 있습니다.
위 명령을 평가하는 데 사용된 쉘 하위 프로세스는 주석에 언급된 두 가지 중 하나가 아닙니다.
감사해요.
답변1
작동하는 것은 eval
매개변수 구문 분석, 변수 확장 등을 수행한 다음 결과 문자열을 정상적으로 실행하는 것입니다.
예를 들면 다음과 같습니다.
$ i=ls
$ eval $i
이는 다음 으로 eval
대체됩니다 .$i
ls
그 다음에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를 사용했습니다.