Bash의 "eval" 명령은 무엇입니까?

Bash의 "eval" 명령은 무엇입니까?

eval이 명령 으로 무엇을 할 수 있나요 ? 왜 유용합니까? bash에 내장된 기능인가요? man해당 페이지 가 없습니다 ..

답변1

evalPOSIX의 일부입니다. 쉘에 내장할 수 있는 인터페이스입니다.

이는 POSIX 프로그래머 매뉴얼에 설명되어 있습니다.http://www.unix.com/man-page/posix/1posix/eval/

eval - construct command by concatenating arguments

인수를 받아들이고 명령을 구성한 다음 쉘에 의해 실행됩니다. 맨페이지의 예는 다음과 같습니다.

foo=10 x=foo    # 1
y='$'$x         # 2
echo $y         # 3
$foo
eval y='$'$x    # 5
echo $y         # 6
10
  1. 첫 번째 줄에서는 $foovalue '10'및 value 를 사용하여 $x정의합니다 'foo'.
  2. 이제 정의하면 $ystring 으로 구성됩니다 '$foo'. 달러 기호는 이스케이프되어야 합니다 '$'.
  3. 결과를 확인하려면, echo $y.
  4. 1)-3)의 결과는 문자열이 됩니다.'$foo'
  5. 이제 반복 할당을 사용합니다 eval. 먼저 $x문자열을 평가합니다 'foo'. 이제 우리는 y=$foo평가될 명령문을 갖게 되었습니다 y=10.
  6. 결과는 echo $y이제 값입니다 '10'.

이는 Perl 및 JavaScript와 같은 많은 언어에서 일반적인 기능입니다. 더 많은 예를 보려면 perldoc eval을 확인하세요.http://perldoc.perl.org/functions/eval.html

답변2

예, evalbash 내부 명령이므로 bash매뉴얼 페이지에 설명되어 있습니다.

eval [arg ...]
    The  args  are read and concatenated together into a single com-
    mand.  This command is then read and executed by the shell,  and
    its  exit status is returned as the value of eval.  If there are
    no args, or only null arguments, eval returns 0.

보통은 같이 가는데명령 대체. 명시적이지 않은 경우 eval쉘은 다음을 시도합니다.구현하다대신 명령 대체 결과평가하다그것.

쓰기를 원한다고 가정하고 VAR=value; echo $VAR쉘이 쓰기를 처리하는 방법의 차이점에 유의하십시오 echo VAR=value.

1.

    andcoz@...:~> $( echo VAR=value )
    bash: VAR=value: command not found
    andcoz@...:~> echo $VAR
    <empty line>

서브셸은 echo명령을 실행하고, 명령은 결과를 VAR=value다시 셸로 대체하며 "VAR=value"는 명령이 아니기 때문에 셸에서 오류를 발생시킵니다. 작업은 실행된 적이 없고 echo편집만 되었기 때문에 여전히 유효하지 않습니다.

2.

    andcoz@...:~> eval $( echo VAR=value )
    andcoz@...:~> echo $VAR
    value

하위 쉘 "VAR=value"는 다시 쉘로 돌아가는 명령으로 대체된 다음 echo쉘에서 eval편집 됩니다.

마지막으로 eval이는 매우 위험한 명령이 될 수 있습니다. eval보안 문제를 방지하려면 명령에 대한 모든 입력을 주의 깊게 확인해야 합니다.

답변3

eval 문은 셸에 인수를 명령으로 평가하고 명령줄에서 실행하도록 지시합니다. 다음과 같은 상황에서 유용합니다.

스크립트에서 명령을 변수로 정의하고 나중에 해당 명령을 사용하려면 eval을 사용해야 합니다.

/home/user1 > a="ls | more"
/home/user1 > $a
bash: command not found: ls | more
/home/user1 > # Above command didn't work as ls tried to list file with name pipe (|) and more. But these files are not there
/home/user1 > eval $a
file.txt
mailids
remote_cmd.sh
sample.txt
tmp
/home/user1 >

답변4

eval별도의 외부 명령이 아니라 내장 셸이기 때문에 매뉴얼 페이지가 없습니다. 즉, 명령이 셸 내부에 있고 bash셸( )에만 알려져 있음을 의미합니다. 매뉴얼 페이지의 관련 부분은 bash다음과 같습니다.

eval [arg ...]
    The args are read and concatenated together into a single command.  
    This command is then  read  and executed by the shell, and its exit 
    status is returned as the value of eval.  If there are no args, or only 
    null arguments, eval returns 0

또한 출력은 다음과 help eval같습니다.

eval: eval [arg ...]
    Execute arguments as a shell command.

    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.

    Exit Status:
    Returns exit status of command or success if command is null.

eval강력한 명령이므로 이를 사용할 계획이라면 가능한 한 피하도록 매우 주의해야 합니다.보안 위험수행원.

관련 정보