부터 bash manpage
:
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.
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename. If filename does not contain a slash, file
names in PATH are used to find the directory containing file‐
name. The file searched for in PATH need not be executable.
When bash is not in posix mode, the current directory is
searched if no file is found in PATH. If the sourcepath option
to the shopt builtin command is turned off, the PATH is not
searched. If any arguments are supplied, they become the posi‐
tional parameters when filename is executed. Otherwise the
positional parameters are unchanged. The return status is the
status of the last command exited within the script (0 if no
commands are executed), and false if filename is not found or
cannot be read.
두 방법 사이에는 차이가 없습니다.
단 하나의 메모가 있습니다. eval
모든 인수를 연결 한 다음 단일 명령으로 실행됩니다. source
파일의 내용을 읽고 실행합니다. eval
인수가 아닌 명령 만 작성할 수 있습니다 stdin
. 따라서 다음과 같이 할 수 없습니다 :
printf "ls" | eval
귀하의 예는 동일한 결과를 제공하지만 목적 eval
과 source
는 다릅니다. source
일반적으로 다른 스크립트에 라이브러리를 제공하는 eval
데 사용되는 반면 명령 평가에만 사용됩니다. 회피 된 eval
끈이 깨끗하다는 보장이 없기 때문에 가능하면 사용을 피해야 합니다. 우리는 subshell
대신 에를 사용하여 위생 검사를 수행해야합니다 .
- () 또는 {}에서 일부 명령을 실행하면 어떤 것이 더 선호됩니까?
중괄호 안에서 시퀀스 명령을 실행하면 { }
모든 명령이 서브 쉘 대신 현재 쉘 에서 실행됩니다 (괄호 안에서 실행하는 경우 (bash 참조 )).
사용하면 subshell ( )
더 많은 리소스가 사용되지만 현재 환경에는 영향을 미치지 않습니다. 사용 { }
은 현재 쉘에서 모든 명령을 실행하므로 환경에 영향을줍니다. 목적에 따라 그중 하나를 선택할 수 있습니다.